Parallel.Foreach 循环,与显式 throw 语句不一致的行为

2023-12-07

使用 Linqpad 创建了一个简单的程序,我在其中显式抛出异常Parallel Foreach循环,理想情况下应在调用者中捕获为Aggregate Exception,但是当我明确抛出异常时,它有时会随机跳过一些异常。我无法理解这种行为,任何人都可以解释:

void Main()
{
    try
    {
      var intList = new List<int> {1,2,3,4,5,6};

      Parallel.ForEach(intList, i => Test1(i));
    }
    catch (AggregateException aggregateException)
    {
        foreach (var ex in aggregateException.Flatten().InnerExceptions)
        {
            ex.Message.Dump();
        }
    }
}

public void Test1(int i)
{
    try
    {
        if (i % 2 != 0)
            throw new Exception($"{i} - Odd value exception");

    }
    catch(Exception ex)
    {
        ex.Message.Dump();
        throw;
    }
}

public void Test2(int i)
{
        if (i % 2 != 0)
            throw new Exception($"{i} - Odd value exception");
}

public void Test3(int i)
    {
        try
        {
            if (i % 2 != 0)
                throw new Exception($"{i} - Odd value exception");

        }
        catch(Exception ex)
        {
            ex.Message.Dump();
        }
    }

Details:

  1. 有两种版本的 Test,一种带有显式 Try Catch,另一种则没有
  2. 两者都有类似的不一致行为,在 Test1 中,即使是本地 try catch 也不会打印值
  3. 可以有第三个版本Test3它始终工作,因为异常没有明确地从并行循环中抛出
  4. Dump是一个 linqpad print 调用,将其替换为Console.WriteLine在视觉工作室

有一个选项定义here,它收集所有异常ConcurrentQueue并稍后将它们作为聚合异常抛出,但为什么当前代码不能按预期工作,我不太确定。在这种情况下,我们期望输出为:

1 - Odd value exception
3 - Odd value exception
5 - Odd value exception

但其中一些是随机跳过的,在简单的程序中也是如此,在复杂的程序中也会有更多的错过,这会做更多的工作


这完全是预期的行为。

See the docs,

未处理的异常导致循环立即终止

当您抛出异常时,不会安排新的任务。

所以行为会显得不可预测。您无权期望所有子任务都会执行。这不是 Parallel.For 循环的契约。

当您向源列表添加更多项目时,差异会更加明显。 输出将始终显示 ThreadPool.MinThreads 附近的许多异常。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Parallel.Foreach 循环,与显式 throw 语句不一致的行为 的相关文章

随机推荐

  • 构建 WSO2 4.1.x 是否需要 Sun/Oracle JDK?

    Is Sun Oracle JDK构建 WSO2 4 1 x 需要吗 我尝试用OpenJDK 但遇到了以下问题 ERROR Failed to execute goal org apache maven plugins maven comp
  • jQuery if has() 选择器执行操作

    ul li text li ul http jsfiddle net wZ8MC 2 jQuery document ready function if jQuery bad drifting has em jQuery bad drift
  • 如何在正则表达式中使用变量(TCL/Expect)

    我试图弄清楚如何在正则表达式匹配中使用字符串 我在谷歌上搜索了一个小时 想我应该问问专家 这有效 usr bin expect set MYSTR value if regexp nocase MYSTR outcome matchresu
  • 过滤/消除噪音

    问题很简单 如何去除数据中的噪音 我已经制作了一些 x 和 y 值以及一些噪声 这些噪声是我正在处理的数据的总体简化 除了随机噪声之外 我无法使其与我必须处理的噪声相同 我真的不知道我是否需要过滤或平滑 我的文件包含两组需要绘制的数据 并且
  • std::vector 的 MPI_Gatherv 问题

    我无法获取MPI Gatherv使用 std vector 我编写了一个小程序 应该用rank 1的整数填充向量 以避免0 因为向量初始化为0 这只是一个使用 2 个 MPI 进程运行的示例程序 我意识到它的可扩展性不太好 include
  • 作业中存储过程的并行执行 (SQL Server)

    简短的 我有五个存储过程 每个存储过程都没有依赖项 相同的事情是它从五个不同的服务器提取数据 我们只是将其整理并提供给我们的服务器 问题 我们已将这五项任务安排在一个作业中 分为 5 个不同的步骤 我想并行执行它而不是顺序执行 额外的 如果
  • 将 double 转换为 int 的结果是错误的

    当我运行以下代码时 似乎存在某种模糊的舍入错误 int roundedTotal int PriorityJob 100 0 最初PriorityJob 1 4 and roundedTotal未定义 评估PriorityJob 100 0
  • 升级到Spring Boot 1.4.0后,AbstractPlatformTransactionManager中出现NullPointerException

    我已从 Spring Boot 1 3 2 升级到 1 4 0 现在无法启动我的应用程序 我的BeanPostProcessor调用 3d party 开源 Lazy Chopper 当尝试getTransaction 这里失败 publi
  • 如何根据 Javascript 中的属性组合两个不同大小的对象数组?

    我有两个长度不同但共享相似信息的对象数组 qrySearchLocID LocalLabID 123f SystemID 5000152 AppLabID 3 LocalLabID 12BC SystemID 5000384 AppLabI
  • 在 Docker 容器内使用 ldap

    我有 2 个 docker 容器 第一个 docker container 内部是我的 lamp 应用程序 其中包含 php 7 3 4 apache2 第二个里面是mysql数据库 我尝试连接第一个容器内的 LDAP 服务器 我继续进入
  • 复合 JTree 节点允许事件传递到下面的对象

    我正在尝试创建一个 JTree 其中一些节点是包含 JLabel 和 JButton 的复合对象 Node 代表 JLabel 显示的服务器和端口 JButton 将使用 Desktop API 打开默认浏览器并转到 URL 我已经阅读了以
  • 如何在 PHP 中减小图像大小而不损失质量 [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我正在尝试开发一个基于图像的网站 我真的对更快的页面加载速度和最佳压缩实践的最佳图像类型感到困惑 请告诉我压缩图像大小的最佳方法 如果您希望使用编码本身来减少大小 您可以在 ph
  • 取消 UILocalNotification

    我的 UILocalNotification 有问题 我正在用我的方法安排通知 void sendNewNoteLocalReminder NSDate date alrt NSString title some code UILocalN
  • 在 JavaScript 中使用标签

    你能向我解释一下如何在与break交互的语句上使用标签 switch while do和for 请举例说明 通常 我看到它在突破到外循环 var i j dance for i 0 i lt 20 i for j 0 j lt 20 j c
  • 在 Pandas 中使用 read_csv 处理不需要的换行符

    我对从 SAP 导出的数据有疑问 有时您可以在发布文本中找到换行符 本来应该在一行中的内容却变成了两行 这会导致一个非常糟糕的数据框 最烦人的是 我无法让 pandas 意识到这个问题 它只是读取那些错误的行 即使列数小于标题 错误 dat
  • RAILS,捆绑安装返回 - 未定义符号:SSLv2_method [重复]

    这个问题在这里已经有答案了 可能的重复 未定义的符号 运行捆绑安装时的 SSLv2 method 我尝试 捆绑安装 我的 Rails 项目 但出现此错误 Fetching gem metadata from https rubygems o
  • 通用链接不适用于 WKWebView

    I have web view基于应用程序和公司中的其他本机应用程序 我们正在使用universal links在需要时将用户重定向到其他应用程序 其他应用程序仍然支持universal links 我可以通过按链接来运行它们Apple N
  • Rails 4 资产管道:来自 js 的 asset_path 中资产缺少指纹

    我正在部署一个 Rails 4 0 应用程序 其中包含 HTML 部分模板作为我们前端 JavaScript 框架的资产 尽管这些模板是资产管道的一部分并且已正确预编译 但当我调用asset path从我们的 js 文件中嵌入的 ruby
  • 在 Javascript 中,“d.setDate(d.getDate() + 1)”在时间更改的天数内给出错误答案

    我有以下代码 var d new Date 2016 03 27 console log d getDate d d setDate d getDate 1 console log d getDate d 这给出了错误的答案 27 Date
  • Parallel.Foreach 循环,与显式 throw 语句不一致的行为

    使用 Linqpad 创建了一个简单的程序 我在其中显式抛出异常Parallel Foreach循环 理想情况下应在调用者中捕获为Aggregate Exception 但是当我明确抛出异常时 它有时会随机跳过一些异常 我无法理解这种行为