2012-03-31 26 views
1

這是我的循環是什麼樣子:Parallel.ForEach loopResult.Stop後不返回()

var loopResult = Parallel.ForEach(folder.Items.Cast<object>(), (item, loopState) => 
    { 
     if (!loadData) 
     { 
      loopState.Stop(); 
      return; 
     } 

     DoSomeWork(item); 
    } 
); 

if (loopResult.IsCompleted) 
{ 
    Debug.WriteLine("done"); 
} 

的問題是代碼永遠不會獲取if (loopResult.IsCompleted)。對所有不同的線程執行return;後,絕對沒有任何反應。

+1

「DoSomeWork」內部發生了什麼? – Tudor 2012-03-31 12:03:18

+0

這實際上是正確的問題,它試圖在GUI線程上調用一個方法調用,該調用永遠不會返回。 – user1151923 2012-04-02 15:26:24

回答

4

因爲並行循環已成功停止,代碼永遠不會到達if (loopResult.IsCompleted)的主體。您可以按如下檢查:

/* ForEach loop as above */ 

if (!loopResult.IsCompleted && 
     !loopResult.LowestBreakIteration.HasValue) 
{ 
    Debug.WriteLine("Loop was stopped"); 
} 

if (loopResult.IsCompleted) 
{ 
    Debug.WriteLine("Loop was done without stopping"); 
} 

你可以找到有用的信息如何Stop/Break並行循環中this MSDN page,從打破循環早期款的開始。

2

thisIsCompleted不會,如果一個循環被過早地結束返回true:

獲取循環是否運行完成,使得被執行循環的所有迭代和循環沒有收到過早結束的請求。

您對Stop()調用導致所有其他環路,exit early,導致IsCompleted評估爲false。