2013-04-28 42 views
7

我很难理解loopState.Stop()loopState.Break()。我已阅读MSDN和几篇关于它的文章,但我仍然感到困惑。停止并行并行。对于

我的理解是,每个迭代分区程序给出处理线程的剩余索引,并且loopState.Stop()停止所有线程,并且loopState.Break()停止当前线程。

但是让我们考虑以下情况:

Parallel.For(0, 100, (i, loopState) => 
{ 
    if (i >= 10) 
     loopState.Break(); 
    Debug.Write(i); 
}); 

这个循环我有休耕结果:

0 25 1 2 3 4 5 6 7 8 9 10 

我不知道为什么在结果有10首25个数字。

任何人都可以帮忙吗?

P.S.我有i5 520M CPU(2核心=> 4线程)

回答

9

loopState.Break()不会破坏功能,如return。所以loopState.Break()之后的行仍然会被执行。在该范围结束后,for检查是否已调用loopState.Break()。如果是,则允许所有循环继续,直到达到号码为Break的号码。

在你的例子中,0到24的循环将会和循环25一起中断,直到49(并显示它们的“中断”数字)。

环50..74和75..99甚至不会开始,因为第二个循环25..49已经中止了整个换操作,因为他们盯着数字越大,则开断次数10

+0

因此loopState.Break()退出所有线程?我使用loopState.Stop()来做这件事。 – 2013-04-28 10:47:10

+0

澄清我以前的评论:我现在明白前两个循环如何停止,但为什么其他两个线程甚至不启动? Break是否能够终止多个线程?如果是这样怎么办? – 2013-04-28 10:54:58

+0

请参阅有关停止与休息的好回答:http://stackoverflow.com/questions/8818203/what-is-difference-between-loopstate-break-loopstate-stop-and-scancellationt – 2013-04-28 11:03:10

3

the documentation of Break()

歇可以用来传达给循环,当前迭代之后没有其他迭代需要运行。例如,如果从for循环的第100次迭代中调用Break,并行迭代次数为0到1000,则仍应运行小于100的所有迭代,但从101到1000的迭代不是必需的。

这意味着当前的迭代仍然会结束(因此10会被打印)。 Break()也不能进行时间​​旅行,所以25将保持打印状态。什么Break()意思是没有新的迭代超出10将开始。

0

中断确保当前正在运行的所有迭代都将完成。

停止只是终止一切。

1

if (i >= 10) loopState.Break();仍将继续当前的迭代。因此打印10

但是,调用loopState.Break()之后的迭代(i> = 10)将不会启动。

但是为什么要打印25?以下图片将解释原因。由于你有4个线程,0-99将被分成4个。

第一个线程有:0-24。
第二个线程:25 - 49
第三线程:50 - 74
4线程:75 - 99

根据我的理解,每个线程将循环的数字本身。根据this post,它说

如果在调用Break时它们已经启动,则可以运行其他迭代。

由于第二个线程几乎与第一个线程同时启动,因此打印了0, 25。然后在第二个线程中循环25时调用if (i >= 10) loopState.Break();

在调用Break()之前,第3个和第4个线程中的循环未启动,因此大于10的任何数字都未打印。

图像REF:http://www.albahari.com/threading/part5.aspx

0

从静态Parallel类中的所有方法都返回ParallelLoopResult。这对象具有两个属性 - IsCompletedLowestBreakIteration

当我们使用loopState.Break()LowestBreakIteration返回表示最低迭代的整数Break语句被称为

当我们使用loopState.Stop()时,LowestBreakIteration Returns null