停止与并行中断.对

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.


svi*_*ick 5

来自以下文档Break()

Break 可用于向循环传达当前迭代之后不需要运行其他迭代的信息。例如,如果从从 0 到 1000 并行迭代的 for 循环的第 100 次迭代调用 Break,则仍应运行小于 100 的所有迭代,但不需要从 101 到 1000 的迭代。

这意味着当前迭代仍将完成(因此10被打印)。Break()也无法进行时间旅行,因此遗嘱25仍保留打印状态。这Break()意味着不会再开始新的迭代。10


Bop*_*Bop 5

最简单的答案:

stop 和 break 都会阻止新迭代的开始。两者都确保开始的迭代完成。

差异 - 停止 - 中止它调用的迭代,而中断则不会。