64 を超える可能性のある一連のスレッドのすべてが作業を完了するまで待機するメイン スレッドが必要なシナリオがあり、そのために次のヘルパー ユーティリティを作成しました (64 の waithandle 制限を回避するため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);
}