2016-06-09 53 views
0

我在C#中有一個方法需要等待事件發生。它將數據發送到客戶端,但它必須等待event Action被觸發(當收到響應數據包時觸發該數據)。如何阻止方法的執行直到處理程序被調用?如何等待異步事件被調用?

回答

1

另一種方法是使用TaskCompletionSourcehttps://social.msdn.microsoft.com/Forums/en-US/a30ff364-3435-4026-9f12-9bd9776c9a01/signalling-await?forum=async

然後它變成:

TaskCompletionSource tsc = new TaskCompletionSource<bool>(); 
Action handler =() => { 
    //Do stuff 
    tsc.SetResult(true); 
} 

Event += handler; 
await tsc.Task; 
Event -= handler; 

引用的討論解釋了爲什麼這是一個更輕量級解。

此外,也不會阻塞線程,並允許一個超時(在事件不被調用的情況下)和/或消除(在情況下,應用程序被關閉)通過使用CancellationTokenSource,見Timeout an async method implemented with TaskCompletionSource

+0

碰巧,我根據我的解決方案 - 我只是認爲使用等待句柄會更快。 – rookie1024

2

該解決方案效果很好,一旦不再需要該事件處理程序,就會從該事件中移除處理程序。

AutoResetEvent evt = new AutoResetEvent(false); 
Action handler =() => { 
    //Do stuff 
    evt.Set(); 
} 

Event += handler; 
evt.WaitOne(); 
Event -= handler; 

然而,有一個重要的警告(一個相當簡單的解決方法):調用線程將無限期阻塞,直到事件被調用。這意味着如果事件從未被調用,您的程序將掛起。造成這種情況的解決方法是簡單地改變evt.WaitOne();evt.WaitOne(SOME_TIMEOUT);

+0

如果你只是在等待一個,爲什麼不使用ManualResetEventSlim?您並不需要重置它,如果您期望快速響應,Slim會提供稍好的性能。 –

+0

好問題。可能應該。 – rookie1024