我有一些场景,我需要一个主线程来等待一组可能超过64个线程的每一个都完成了他们的工作,为此我写了以下帮助程序效用,(以避免上WaitHandle.WaitAll()
64 WaitHandle的极限)多线程 - 等待所有线程发信号
public static void WaitAll(WaitHandle[] handles)
{
if (handles == null)
throw new ArgumentNullException("handles",
"WaitHandle[] handles was null");
foreach (WaitHandle wh in handles) wh.WaitOne();
}
在此实用程序的方法,但是,每个WaitHandle中只检查后每前一个阵列中的已用信号通知...所以它实际上是同步,并且如果等待句柄是autoResetEvent等待句柄(一旦等待线程被释放,它就会清除)将不起作用
要解决此问题,我正在考虑将此代码更改为以下内容,但希望其他人检查并查看它是否会起作用,或者如果有人看到任何问题,或者可以提供更好的方法......
在此先感谢:
public static void WaitAllParallel(WaitHandle[] handles)
{
if (handles == null)
throw new ArgumentNullException("handles",
"WaitHandle[] handles was null");
int actThreadCount = handles.Length;
object locker = new object();
foreach (WaitHandle wh in handles)
{
WaitHandle qwH = wh;
ThreadPool.QueueUserWorkItem(
delegate
{
try { qwH.WaitOne(); }
finally { lock(locker) --actThreadCount; }
});
}
while (actThreadCount > 0) Thread.Sleep(80);
}
您确定您需要64+个主题?这味道稍微IMHO。 – dtb 2009-12-30 21:33:59
您是否可以进一步解释如何以及为什么使用AutoResetEvent?工作完成后线程是否结束? – dtb 2009-12-30 21:36:32
而不是锁定对象,为什么不使用Interlocked(http://msdn.microsoft.com/en-us/library/system.threading.interlocked.aspx)类来增加和减少活动工作器的数量? – 2009-12-30 21:40:54