[英]How do I have the main thread wait for other threads when using the Event-based Asynchronous Pattern?
[英]How do I wait for an asynchronous event to be called?
我在C#中有一個方法,需要等待事件發生。 它正在將數據發送到客戶端,但是它必須等待event Action
被觸發(在收到響應數據包時觸發)。 在調用處理程序之前,如何阻止方法的執行?
此解決方案效果很好,一旦不再需要該處理程序,便將其從事件中刪除。
AutoResetEvent evt = new AutoResetEvent(false);
Action handler = () => {
//Do stuff
evt.Set();
}
Event += handler;
evt.WaitOne();
Event -= handler;
但是,有一個主要警告(有一個相當簡單的解決方法): 調用線程將無限期阻塞,直到事件被調用為止。 這意味着,如果永不調用該事件,則程序將掛起。 解決方法是簡單地更改evt.WaitOne();
evt.WaitOne(SOME_TIMEOUT);
一種替代方法是使用TaskCompletionSource
請參見https://social.msdn.microsoft.com/Forums/zh-CN/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用TaskCompletionSource實現的異步方法
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.