2012-03-31 60 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。