这可能不会阻止使用WaitHandle.WaitAll(waitHandles)的winForm,但只需设置另一个线程,它将从WaitHandle.WaitAll获取complate信号时触发?C#线程,WaitHandle.WaitAll
回答
我不会使用WaitHandle.WaitAll
。这种方法存在一些问题。
- 有64个手柄限制。
- 它不能在STA线程上使用。
- 它促进了模式,这取决于创建明显消耗资源的多个
WaitHandle
实例。
相反,我通常在我想等待多个事件时使用CountdownEvent
类。现在,你将遇到的问题是它仍然要求你在某个线程上调用Wait
,这正是你想要避免的。避免进行阻塞呼叫的标准机制是使用ThreadPool.RegisterWaitForSingleObject
方法。但是,不幸的是,这需要WaitHandle
和CountdownEvent
不会从该类继承。
解决的方法是创建您自己的CountdownWaitHandle
类,该类可以在ThreadPool.RegisterWaitForSingleObject
方法中使用。这种方法将允许您指定一个WaitHandle
被发送信号后执行的回调委托。
这是CountdownWaitHandle
类的最基本的实现。你将不得不自己添加所有必要的代码,但这会让你开始。
的这里的想法是,而不是使用许多不同的WaitHandle
情况下,你使用一个CountdownWaitHandle
实例。用期望的计数初始化实例,然后调用Signal
减少计数。一旦计数变为零,WaitHandle
将进入信号状态。因此,您不必在多个WaitHandle
实例上调用Set
,并使用WaitHandle.WaitAll
阻止,您现在在此实例上调用Signal
,并通过调用WaitOne
来阻止。再次,您可以通过使用TheadPool.RegisterWaitForSingleObject
来阻止对线程池的阻止调用,当WaitHandle
被发信号时它将调用回调。
看一看ManualResetEvent
。使用它你可以在线程完成时设置事件,任何其他线程都可以等待这个事件,或者检查它是否处于信号状态。
ManualResetEvent ev = new ManualReserEvent();
while(Users["user428547"].AcceptanceRate == 0)
{
// this might take a long time
};
ev.Set(); // done, he accepted an answer.
也许你可以启动另一个线程自己,并呼吁WaitHandle.WaitAll
自己上线?如果你没有启动太多的其他线程,这应该工作得很好。
- 1. NotSupportedException在WaitHandle.WaitAll
- 2. WaitHandle.WaitAll在所有线程完成之前运行 - VB.Net 4.0
- 3. 单线程C多线程#
- 4. Windows Phone上WaitHandle.WaitAll的替代软件?
- 5. C#线程编程
- 6. 从C#线程
- 7. Objective-C线程
- 8. C#多线程
- 9. 多线程C
- 10. C++ 0x线程
- 11. C++多线程
- 12. C++线程池
- 13. C#多线程
- 14. C++多线程
- 15. WPF线程C#
- 16. C#多线程
- 17. C#多线程
- 18. C#线程数
- 19. C#多线程
- 20. C#线程
- 21. C++ 11线程vs升级线程
- 22. 多线程COMObject和UI线程(C#)
- 23. c#线程访问其他线程
- 24. C++ Pthreads - 多线程比单线程慢
- 25. C++提升线程重用线程
- 26. Erlang和C/C++线程
- 27. 从C调用C++线程
- 28. C#COM跨线程
- 29. C++线程的Qt
- 30. 线程示例C#
你应该接受你的问题的答案。 – SLaks 2010-11-21 18:54:49