我有一些場景,我需要一個主線程來等待一組可能超過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