質問

一時的にアタッチしている静的メソッドに静的イベントがあります。これは、メモリ内でぶらぶらしたり、2回呼び出すと2つのイベントハンドラーを起動する状況にならないようにするためです。

これらが静的であるかどうかについてはほとんど言及しておらず、議論/リファクタリングの責任を負わないことを好みます。

最初はこのようにしていました

public static void DoSomething()
{
    try
    {
        MyStaticClass.MyEvent +=new EventHandler<HandledEventArgs>(MyStaticClass_HandleMe);
        ... //Doing Stuff
    }
    finally
    {
        MyStaticClass.MyEvent -=new EventHandler<HandledEventArgs>(MyStaticClass_HandleMe);//Detach from event
    }
}

これはうまく機能していますが、イベントをインラインで処理し、メソッド内の別のイベントと一貫性を保ち、関数に対してローカルで他のイベントによって使用されるキャンセルブール値を設定したいと思います。

public static void DoSomething()
{
    try
    {
        bool cancel = false;
        MyStaticClass.MyEvent +=new EventHandler<HandledEventArgs>(delegate(object sender, HandledEventArgs e)
        {
            cancel = true;
        })
        ... //Doing Stuff dependent on cancel = false;
    }
    finally
    {
        //???
    }
}

シナリオ2での質問は、静的イベントをクリーンアップして切り離すにはどうすればよいですか?

役に立ちましたか?

解決

次のようなものを試すことができます:

public static void DoSomething()
{
    bool cancel = false;
    EventHandler<EventArgs> handler = delegate { cancel = true; };

    try
    {
        MyStaticClass.MyEvent += handler;
    }
    finally
    {
        MyStaticClass.MyEvent -= handler;
    }
}

他のヒント

このスレッドで優れたアプローチをご覧ください。

基本的に、インラインメソッドをデリゲートに保存し、最後にサブスクライブを解除します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top