如何在 C# 中跳出内部嵌套的 Parallel.Foreach 循环?

问题描述

为什么这个 break 语句不起作用?我的目标是打破仅内循环,但继续处理外循环。无论我做什么,它都会击中 Console.WriteLine()

我试过了:

  1. innerLoopState.Break()
  2. 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.");
            }
        });
    });
}

enter image description here

解决方法

您的问题的直接答案是:咖喱外循环状态并根据需要打破它:

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.");
        }
    });
});

但是,数组中的所有元素都将立即由您的代码处理,因为与现代计算机拥有的内核数量相比,这些元素非常少。简单地请求并行循环中断不会神奇地中断所有线程,它只会阻止处理新线程。