C# Parallel.ForEach在loopResult.Stop()之后不返回

C# Parallel.ForEach在loopResult.Stop()之后不返回,c#,.net,multithreading,parallel-processing,C#,.net,Multithreading,Parallel Processing,这就是我的循环的样子: var loopResult = Parallel.ForEach(folder.Items.Cast<object>(), (item, loopState) => { if (!loadData) { loopState.Stop(); return; } DoSomeWork(item); } ); if (loopR

这就是我的循环的样子:

var loopResult = Parallel.ForEach(folder.Items.Cast<object>(), (item, loopState) =>
    {
        if (!loadData)
        {
            loopState.Stop();
            return;
        }

        DoSomeWork(item);
    }
);

if (loopResult.IsCompleted)
{
    Debug.WriteLine("done");
}

问题是,如果loopResult.IsCompleted,代码永远无法访问。执行返回后;对于所有不同的线程,绝对不会发生任何事情

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

您可以在中找到如何停止/中断并行循环的有用信息,从中断循环的早期小节开始。

由于并行循环已成功停止,因此代码永远不会到达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");
}
您可以在中找到如何停止/中断并行循环的有用信息,从中断循环的早期小节开始。

根据,如果循环过早结束,IsCompleted将不会返回true:

获取循环是否运行到完成状态,以便执行循环的所有迭代,并且循环不会收到提前结束的请求

您对Stop的调用会导致所有其他循环终止,导致IsCompleted求值为false。

根据,如果循环过早结束,IsCompleted将不会返回true:

获取循环是否运行到完成状态,以便执行循环的所有迭代,并且循环不会收到提前结束的请求


您对Stop的调用会导致所有其他循环停止,导致IsCompleted Evaluation为false。

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