这就是我的循环:
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;
之后,绝对没有任何反应。
答案 0 :(得分: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");
}
您可以在{{3>}中找到有关Stop/Break
并行循环的有用信息,从早期破坏循环小节开始。
答案 1 :(得分:2)
根据this,如果循环过早结束,IsCompleted
将不会返回true:
获取循环是否运行完成,以便循环的所有迭代都被执行并且循环没有收到过早结束的请求。
您对Stop()
的来电导致所有其他循环转为exit early,导致IsCompleted
评估为假。