问题描述
为什么这个 break 语句不起作用?我的目标是打破仅内循环,但继续处理外循环。无论我做什么,它都会击中 Console.WriteLine()
。
我试过了:
innerLoopState.Break()
innerLoopState.Stop()
不要在 Console.WriteLine()
... 之前停止循环
private static ParallelOptions ParallelCityOptions => new ParallelOptions
{
MaxDegreeOfParallelism = 2
};
private static ParallelOptions ParallelPeopleOptions => new ParallelOptions
{
MaxDegreeOfParallelism = 3
}
[Test]
public void nestedParallelForeach()
{
var listofCities = new List<string> {"Atlanta","Denver","Scranton",};
var listofPeople = new List<string>() {"Bob","Sally","Craig","Bill"};
Parallel.ForEach(listofCities,ParallelCityOptions,city =>
{
Parallel.ForEach(listofPeople,ParallelPeopleOptions,(person,innerLoopState) =>
{
if (person == "Bill")
{
// do something
innerLoopState.Break();
Console.WriteLine("Should never hit this line.");
}
});
});
}
解决方法
您的问题的直接答案是:咖喱外循环状态并根据需要打破它:
Parallel.ForEach(listOfCities,ParallelCityOptions,(city,outerLoopState) =>
{
Parallel.ForEach(listOfPeople,ParallelPeopleOptions,(person,innerLoopState) =>
{
if (person == "Bill")
{
// do something
outerLoopState.Break();
innerLoopState.Break();
Console.WriteLine("Should never hit this line.");
}
});
});
但是,数组中的所有元素都将立即由您的代码处理,因为与现代计算机拥有的内核数量相比,这些元素非常少。简单地请求并行循环中断不会神奇地中断所有线程,它只会阻止处理新线程。