我有一个线程运行,委托出一些任务。当一项任务完成时,会引发一个事件,说明它已完成。这些任务需要按照特定的顺序运行,并且需要等待上一个任务完成。如何让线程等待,直到它收到“任务完成”事件? (除了显而易见的事件处理程序设置了一个标志,然后一个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