我在学习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);
)。
根据这本书的说法:“中断可确保当前正在运行的所有迭代都将完成”
答案 0 :(得分:2)
那是因为所有其他迭代已经开始。如果要停止所有操作,则需要使用loopState.Stop()
而不是loopState.Break()
loopState.Break()
意味着在当前线程的当前迭代之前完成所有线程的所有迭代,然后退出循环。
loopState.Stop()
意味着在方便时立即停止所有迭代。