ParallelLoopState-使用Break不退出当前迭代,为什么?

时间:2018-10-01 12:41:45

标签: c# multithreading loops task

我在学习ParallelLoopState时遇到了这个示例:

Parallel.For(0, 10, (int i, ParallelLoopState loopState) =>
            {
                if (i == 5)
                {
                    Console.WriteLine("Breaking loop");
                    loopState.Break();
                    Console.WriteLine("LowestBreakIteration = " +
 loopState.LowestBreakIteration);
                    }
                    Thread.Sleep(1000);
                    Console.WriteLine("i= " + i);

                });

可能的结果是:

i= 6
i= 4
i= 0
Breaking loop
LowestBreakIteration = 5
i= 2
i= 8
i= 1
i= 3
i= 7
i= 5

显然,每次运行该应用程序时,都会产生不同的结果。 如何将“ LowestBreakIteration = 5”和“ i = 5”用其他i值分开? 我认为一旦完成if (i==5),它将直接进行下一次迭代,而无需在控制台中编写i = 5(最后一行代码:Console.WriteLine("i= " + i);)。 根据这本书的说法:“中断可确保当前正在运行的所有迭代都将完成”

1 个答案:

答案 0 :(得分:2)

那是因为所有其他迭代已经开始。如果要停止所有操作,则需要使用loopState.Stop()而不是loopState.Break()

loopState.Break()意味着在当前线程的当前迭代之前完成所有线程的所有迭代,然后退出循环。

loopState.Stop()意味着在方便时立即停止所有迭代。