我可以肯定的是每次調用DoSomethingWithObject已完成 的ForEach返回之前,還是需要使用WaitHandles自己?
Parallel.ForEach
是阻止呼叫。直到每次迭代完成後纔會返回。
有沒有相當於WaitHandle.WaitAll(...);
?
是的,或多或少。它實際上並不使用WaitHandle.WaitAll
,因爲1)它的效率非常低,2)由於它具有64個句柄限制,因此它不具有可伸縮性。有幾個非常可擴展的技術可用於等待多個任務的完成。我的最愛之一是使用CountdownEvent
。
這是它是如何工作的。用你的想象力和假裝Parallel.ForEach
得到擴展到下面的代碼。
var finished = new CountdownEvent(1);
foreach (var item in collection)
{
var capture = item;
finished.AddCount();
Task.Factory.StartNew(
() =>
{
try
{
DoSomething(capture);
}
finally
{
finished.Signal();
}
});
}
finished.Signal();
finished.Wait();
我不是說這是Parallel.ForEach
使用的技術,但它可能是類似的東西。
實際上,Parallel.ForEach
以更復雜的方式實現。我只是試圖幫助你想象它如何等待每次迭代完成。
謝謝。我寫了一個測試,其中'DoSomethingWithObject'睡了3秒鐘。行爲如預期。 – Anthony 2012-02-23 03:31:00