我在C#中有一個方法需要等待事件發生。它將數據發送到客戶端,但它必須等待event Action
被觸發(當收到響應數據包時觸發該數據)。如何阻止方法的執行直到處理程序被調用?如何等待異步事件被調用?
回答
另一種方法是使用TaskCompletionSource
見https://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
該解決方案效果很好,一旦不再需要該事件處理程序,就會從該事件中移除處理程序。
AutoResetEvent evt = new AutoResetEvent(false);
Action handler =() => {
//Do stuff
evt.Set();
}
Event += handler;
evt.WaitOne();
Event -= handler;
然而,有一個重要的警告(一個相當簡單的解決方法):調用線程將無限期阻塞,直到事件被調用。這意味着如果事件從未被調用,您的程序將掛起。造成這種情況的解決方法是簡單地改變evt.WaitOne();
到evt.WaitOne(SOME_TIMEOUT);
如果你只是在等待一個,爲什麼不使用ManualResetEventSlim?您並不需要重置它,如果您期望快速響應,Slim會提供稍好的性能。 –
好問題。可能應該。 – rookie1024
- 1. 如何等待異步調用完成?
- 2. Silverlight等待異步調用
- 3. Actionscript等待異步事件函數
- 4. 用Javascript等待異步調用
- 5. NodeJs - 異步/待機異步/等待
- 6. 等待一個異步回調同步
- 7. 等待通知異步調用
- 8. 等待異步方法在c#調用
- 9. 淨調用異步方法,並等待
- 10. 等待/異步跨線程調用?
- 11. 在調度中使用異步等待
- 12. 調用異步方法而不等待
- 13. DefaultExecutor不等待結果(異步調用)
- 14. 等待異步調用完成
- 15. 等待多個異步調用完成?
- 16. 異步等待調用後的Console.WriteLine。
- 17. Elasticsearch.js - 等待ping完成,異步調用
- 18. 如何等待C#事件被提出?
- 19. 異步編程使用異步/等待
- 20. 如何使用異步等待
- 21. 如何正確使用異步等待
- 22. 如何反彈使用異步/等待?
- 23. 異步/等待appengine
- 24. 異步/等待與
- 25. 異步CTP - 我如何使用異步/等待對該調用WCF服務?
- 26. 使用異步/等待$ .ajax
- 27. 如何等待所有異步REST調用使用Unirest完成?
- 28. 如何等待異步wcf調用完成使用結果?
- 29. 等待/異步任務不等待
- 30. DART異步/等待不等待
碰巧,我根據我的解決方案 - 我只是認爲使用等待句柄會更快。 – rookie1024