我有一個線程運行,委託出一些任務。當一項任務完成時,會引發一個事件,說明它已完成。這些任務需要按照特定的順序運行,並且需要等待上一個任務完成。如何讓線程等待,直到它收到「任務完成」事件? (除了顯而易見的事件處理程序設置了一個標誌,然後一個while循環輪詢該標誌)可以使用哪些方法使線程等待事件並繼續執行?
15
A
回答
27
我經常使用的AutoResetEvent
等待句柄,當我需要等待異步任務完成:
public void PerformAsyncTasks()
{
SomeClass someObj = new SomeClass()
AutoResetEvent waitHandle = new AutoResetEvent(false);
// create and attach event handler for the "Completed" event
EventHandler eventHandler = delegate(object sender, EventArgs e)
{
waitHandle.Set(); // signal that the finished event was raised
}
someObj.TaskCompleted += eventHandler;
// call the async method
someObj.PerformFirstTaskAsync();
// Wait until the event handler is invoked
waitHandle.WaitOne();
// the completed event has been raised, go on with the next one
someObj.PerformSecondTaskAsync();
waitHandle.WaitOne();
// ...and so on
}
5
一個選項是使用EventWaitHandle來表示完成。
1
你可以使用這個ManualResetEvent。
需要首先處理的線程只需要resetEvent,並等待直到結束才能設置事件。
需要等待的線程可以持有它的句柄,並調用resetEvent.WaitOne()。這將阻止該線程,直到第一個完成。
這允許您以非常乾淨的方式處理事件的阻塞和排序。
0
通過使用工作線程完成時調用的回調方法,我得到了很好的結果。它擊敗了輪詢,並且很容易將參數傳回給調用者。
相關問題
- 1. 等待條件繼續方法之前
- 2. jQuery等待動畫繼續執行PHP
- 3. 等待方法的n個執行再繼續後完成
- 4. 可以一個while循環等待事件繼續java
- 5. 等待線程繼續在Android
- 6. 如何在等待在同一個線程上執行後繼續執行?
- 7. 切換到後臺線程並繼續執行方法
- 8. 繼續處理之前等待事件
- 9. 的Javascript - 等待事件繼續
- 10. 如何使用等待或線程等待事件發生
- 11. 任務繼續並行執行與異步/等待
- 12. 停止方法執行並等待事件?
- 13. 當主線程繼續執行時,執行兩個等待另一個線程的線程
- 14. 在繼續執行之前讓MATLAB程序等待事件的函數
- 15. 讓等待線程跳過剩下的等待/繼續
- 16. 在繼續執行方法之前等待可變時間完成
- 17. Android - 在繼續使用方法之前等待json獲取值
- 18. 哪些perf事件可以使用PEBS?
- 19. 讓JavaFX等待並繼續執行代碼
- 20. Android - 等待Volley響應完成並繼續執行
- 21. 等待RunOnUIThread完成並繼續執行其餘任務
- 22. UML - 代表等待並繼續執行操作
- 23. 等待的條件繼續
- 24. 線程併發等待()其他線程完成並繼續工作
- 25. 線程設計時需要兩個:等待並繼續
- 26. 執行外部可執行文件運行並等到它完成並繼續使用NSIS安裝
- 27. Perl程序繼續等待使用utf8打開文件
- 28. 等待目錄(Windows)存在以繼續執行代碼? (2.7)
- 29. Delphi的線程等待數據,對其進行處理,然後繼續等待
- 30. RxJS - 等待繼續
根據第一個答案,我正在做一些與此非常相似的事情。使用EventResetMode.AutoReset初始化AutoResetEvent和EventWaitHandle有什麼區別? – MGSoto 2009-08-07 18:38:04
@MGoto:我認爲差異很小(如果有的話):'AutoResetEvent'繼承自'EventWaitHandle',並且似乎使用其基類的構造函數向其傳遞'EventResetMode.AutoReset'。 – 2009-08-07 18:51:28
別忘了,AutoResetEvent,WaitHandles等實現了IDisposable – 2013-06-17 14:03:10