c# - Stop vs Break in Parallel.For

标签 c# .net 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);
});

对于这个循环我有以下结果:

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

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

有人可以帮忙吗?

附言我有 i5 520M CPU(2 核 => 4 线程)

最佳答案

loopState.Break() 不会像 return 那样中断函数。所以 loopState.Break() 之后的行仍然会被执行。在该范围结束该数字后,for 检查是否调用了 loopState.Break()。如果是这样,则允许所有循环继续,直到达到称为 Break 的数字。

在您的示例中,0 到 24 的循环将与 25 到 49 的循环同时中断(并显示它们的“中断”数字)。

循环 50..74 和 75..99 甚至不会开始,因为第二个循环 25..49 已经中止了整个 for 操作,因为它们的起始数字大于中断数字 10。

关于c# - Stop vs Break in Parallel.For,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16261663/

相关文章:

c# - 在 .Net Core 3.1 中使用重定向和 Cookie 复制 cURL 命令

c# - 执行 MySQL 查询时出错

.net - 如何部署 Orchard CMS 站点,包括开发环境中的所有设置和内容?

c# - 如何在分离的 Entity Framework 4.1 POCO 实体上保存更新的多对多集合

c# - 将多个 ORDER BY 子句添加到 NHibernate 查询会引发异常

.net - 从Iron Python生成.NET程序集

c - `while(1)`如何优化不占用所有资源?

javascript - 检查值是否相同(不区分大小写)

c - 使用 while 循环发出 fgetc() c

c# - 将 Window 项绑定(bind)到 usercontrol 底层控件