在loopResult.Stop()之后并行返回Parallel.ForEach

时间:2012-03-31 11:33:45

标签: c# .net multithreading parallel-processing

这就是我的循环:

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;之后,绝对没有任何反应。

2 个答案:

答案 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评估为假。