1

次のコードシナリオが必要になることがよくあります

イベントに申し込む -> イベントを待つ -> イベントから退会します。

以下よりも良い方法はありますか?

myEvent += mydelegate;
while (mydelegatewasn't called)
{
     // do stuff
}   
myEvent -= mydelegate;

また、代理人が作業を完了するのを待つ最良の方法は何ですか?

4

1 に答える 1

0

AutoResetEventwhile ループでスピンする代わりに、クラスを調べて、デリゲートが作業を完了するのを待つことを検討することをお勧めします。これにより、デリゲートが終了するのを待っている間のスピンを回避できます。

void Main()
{
    RunActionOnceOnEvent(delegate()
    {
        // do stuff
    });
}

void RunActionOnceOnEvent(Action action)
{
    AutoResetEvent autoResetEvent = new AutoResetEvent(false);
    EventDelegate handler = delegate() 
    { 
        autoResetEvent.Set(); 
    }); 

    myEvent += handler;

    try
    {
        autoResetEvent.WaitOne();
        action();
    }
    finally 
    {
        myEvent -= handler;
    }
}

さまざまなイベントのボイラープレート コードの量を削減するという点では、イベントは一流ではないため、多くのことができるかどうかはわかりません。

于 2012-04-22T06:41:30.800 に答える