2

一時的にアタッチしている静的メソッドに静的イベントがあります。これは、メモリ内にぶら下がったり、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 で、静的イベントをクリーンアップして切り離すにはどうすればよいですか?

4

2 に答える 2

4

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

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

    try
    {
        MyStaticClass.MyEvent += handler;
    }
    finally
    {
        MyStaticClass.MyEvent -= handler;
    }
}
于 2009-03-17T01:31:18.363 に答える
1

優れたアプローチについては、このスレッドを参照してください。

基本的に、インライン化されたメソッドをデリゲートに保存し、finally 中にサブスクライブを解除するだけです。

于 2009-03-17T01:31:01.890 に答える