2012-04-22 40 views
1

我發現自己經常需要下面的代碼場景單個使用事件的模式或語言工具?

訂閱到事件 - >等待事件 - >退訂事件。

有什麼比更好的辦法:

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

還什麼是等待我的委託,以完成其工作的最佳方式?

回答

0

而不是在一個while循環中旋轉,您可能需要考慮看看AutoResetEvent類以等待您的委託完成其工作。這樣可以避免在等待委託完成時旋轉。

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; 
    } 
} 

在減少針對不同事件樣板代碼量而言,我不知道,你就可以做很多,因爲事件不是一流的。

+1

這會在多線程的情況下失敗。 – Grozz 2012-04-22 06:53:29

+0

如果在線程本地範圍上創建AutoResetEvent。這將是好的AutoResetEvent的新實例是爲不同的線程創建的。 – 2012-04-22 07:04:57

+0

在兩個線程同時觸發事件的情況下,該動作將執行兩次。 – Grozz 2012-04-22 07:55:55