我听说在多个线程上使用waitall时存在限制(要等待的线程数?)。谁能提供详细信息?
答案 0 :(得分:2)
我认为您所指的限制不在于线程的数量;它取决于等待的句柄的数量。来自WaitHandle.WaitAll(WaitHandle[])
的{{3}}:
在某些实现中,如果超过 传递64个句柄,a 抛出NotSupportedException。
在这个问题突然发生的极少数情况下,我通常会用以下方法解决这个问题:
WaitHandle[] handles = ...
foreach(var waitHandle in handles)
waitHandle.WaitOne();
为完整起见,其他限制似乎是:
如果数组包含重复项,则 呼叫失败了 DuplicateWaitObjectException。
不支持WaitAll方法 具有STAThreadAttribute的线程。
答案 1 :(得分:1)
您是否正在考虑winform应用程序的STA(单线程单元公寓)限制?
如果是这样,我只需检查每个线程完成处理后的'工作队列'是否为空,并在主线程拥有的单个ManualResetEvent对象上调用.WaitOne()而不是使用.WaitAll(我)。
像这样:
moSolverEvent = new ManualResetEvent(false);
ProcessResult(new SolverWorkInProgress());
//Wait here until the last background thread reports in
moSolverEvent.WaitOne();
然后工作线程正在执行此操作:
if (mhSolverWorkQueue.Count == 0) moSolverEvent.Set();
它运行得非常好,并且避免了WaitAll()的任何问题,即使在WinForms应用程序中也是如此。毕竟,你并不是在等待线程完成......你在等待工作完成。 : - )
请确保对每个对象执行适当的锁定,这样您的线程就不会相互重叠。