我有一些场景,我需要一个主线程来等待,直到一组可能的超过 64 个线程中的每一个都完成了它们的工作,为此我编写了以下帮助程序实用程序,(以避免 64 个等待句柄限制WaitHandle.WaitAll()
)
public static void WaitAll(WaitHandle[] handles)
{
if (handles == null)
throw new ArgumentNullException("handles",
"WaitHandle[] handles was null");
foreach (WaitHandle wh in handles) wh.WaitOne();
}
但是,使用此实用方法,每个等待句柄仅在数组中的每个前一个已发出信号后才检查...因此它实际上是同步的,如果等待句柄是 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);
}