Parallel.ForEach没有';t在loopResult.Stop()之后返回
本文关键字:Stop loopResult 返回 之后 没有 ForEach Parallel | 更新日期: 2023-09-27 18:29:33
这就是我的循环:
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;
之后,绝对不会发生任何事情。
由于并行循环已成功停止,代码从未到达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");
}
从Breaking Out of Loops Early小节开始,您可以在这个MSDN页面中找到如何Stop/Break
并行循环的有用信息。
根据这一点,如果循环提前结束,IsCompleted
将不会返回true:
获取循环是否运行到完成,以便执行循环的所有迭代,并且循环不会收到提前结束的请求。
对Stop()
的调用会导致所有其他循环提前退出,从而导致IsCompleted
评估为false。