等待所有限制

时间:2010-11-16 03:39:30

标签: c# .net

我听说在多个线程上使用waitall时存在限制(要等待的线程数?)。谁能提供详细信息?

2 个答案:

答案 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应用程序中也是如此。毕竟,你并不是在等待线程完成......你在等待工作完成。 : - )

请确保对每个对象执行适当的锁定,这样您的线程就不会相互重叠。