【问题标题】:Parallel.ForEach doesn't return after loopResult.Stop()Parallel.ForEach 在 loopResult.Stop() 之后不返回
【发布时间】:2012-03-31 11:33:45
【问题描述】:

这是我的循环的样子:

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

【问题讨论】:

  • DoSomeWork 内部发生了什么?
  • 这实际上是一个正确的问题,它陷入了试图在 GUI 线程上调用方法调用的方法中,该方法从未返回。

标签: c# .net multithreading parallel-processing


【解决方案1】:

代码永远不会到达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");
}

您可以在this MSDN page 中找到有关如何Stop/Break 并行循环的有用信息,从尽早中断循环 小节开始。

【讨论】:

    【解决方案2】:

    根据this,如果循环提前结束,IsCompleted 将不会返回 true:

    获取循环是否运行完成,这样循环的所有迭代都已执行并且循环没有收到提前结束的请求。

    您对Stop() 的调用会导致所有其他循环到exit early,从而导致IsCompleted 评估为假。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-03
      • 1970-01-01
      • 2012-09-18
      • 2012-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多