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;之后,绝对不会发生任何事情。

Parallel.ForEach没有';t在loopResult.Stop()之后返回

由于并行循环已成功停止,代码从未到达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。