Mic*_*ski 10 .net c# loops task-parallel-library
我很难理解loopState.Stop()和loopState.Break().我已阅读MSDN和几篇关于它的帖子,但我仍感到困惑.
我的理解是每个迭代分区器都为线程提供剩余索引来处理和loopState.Stop()停止所有线程并loopState.Break()停止当前线程.
但是让我们考虑以下情况:
Parallel.For(0, 100, (i, loopState) =>
{
if (i >= 10)
loopState.Break();
Debug.Write(i);
});
Run Code Online (Sandbox Code Playgroud)
对于这个循环,我有结果:
0 25 1 2 3 4 5 6 7 8 9 10
Run Code Online (Sandbox Code Playgroud)
我不知道为什么在结果中有10个和25个数字.
有人可以帮忙吗?
PS我有i5 520M CPU(2核=> 4个线程)
Mar*_*der 11
loopState.Break()不会破坏这样的功能return.所以loopState.Break()仍然会执行之后的行.在该范围的该范围结束后,for检查是否loopState.Break()已被调用.如果是这样,则允许所有循环继续,直到达到调用的数量Break.
在你的例子中,0到24的循环将在循环25到49的同时断开(并显示它们的"断开"数字).
循环50..74和75..99甚至不会启动,因为第二个循环25..49已经中止了整个for-operation,因为它们的凝视数大于破碎数10.
来自以下文档Break():
Break 可用于向循环传达当前迭代之后不需要运行其他迭代的信息。例如,如果从从 0 到 1000 并行迭代的 for 循环的第 100 次迭代调用 Break,则仍应运行小于 100 的所有迭代,但不需要从 101 到 1000 的迭代。
这意味着当前迭代仍将完成(因此10被打印)。Break()也无法进行时间旅行,因此遗嘱25仍保留打印状态。这Break()意味着不会再开始新的迭代。10