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线程从未返回。