为什么子任务的许多异常中只传播其中之一?

2023-11-30

我正在努力更好地掌握 TPL 中异常和错误处理的基本原理(并且在 .NET 4.5 异步/等待任务中运气更好)

The slightly modified from my earlier question "How to better understand the code/statements from "Async - Handling multiple Exceptions" article?" C# console app code running 2 detached inner nested attached (dependent) child (Update: sorry, started one question but ended by another!) tasks:

class Program
{  
   static void Main(string[] args)
   {  Tst();
      Console.ReadLine();
   }
   async static Task  Tst()
   {
       try
       {
           await Task.Factory.StartNew
             (() =>
                {
                   Task.Factory.StartNew
                       (   () => { 
                                    Console.WriteLine("From 1st child");
                                    throw new NullReferenceException(); 
                                  }
                            , TaskCreationOptions.AttachedToParent
                        );
               Task.Factory.StartNew
                       (  () =>
                               { 
                                   Console.WriteLine("From 2nd child");
                                   throw new ArgumentException(); 
                               }
      ,TaskCreationOptions.AttachedToParent
                       );
                }
             );
    }
    catch (AggregateException ex)
    {
        Console.WriteLine("** {0} **", ex.GetType().Name);
        foreach (var exc in ex.Flatten().InnerExceptions)
        {
             Console.WriteLine(exc.GetType().Name);
        }
    }
    catch (Exception ex)
    {
       Console.WriteLine("## {0} ##", ex.GetType().Name);
    }
 } 

产生在以下之间交替(非确定性)的输出:

From 1st child
From 2nd child
** AggregateException **
ArgumentException

and

From 1t child
From 2nd child
** AggregateException **
NullReferenceException

似乎总是传播/捕获的子任务之一中总是有且只有一个异常。

为什么只传播/捕获一个异常?
我会更好地理解是否总是捕获子任务中的任何异常或所有异常

在这种情况下,是否有可能同时捕获两个异常或不捕获任何异常?


您不应该将父/子任务与async。它们并不是设计来一起使用的。

svick 已经回答了这个问题作为一部分他对你其他问题的(正确)答案。您可以这样想:

  • 每个内StartNew得到一个异常,该异常被包装到AggregateException并放置在返回的Task.
  • 外层StartNew两者兼得AggregateException来自其子任务,并将其包装到另一个任务中AggregateException其返回时Task.
  • 当你await a Task,引发第一个内部异常。其他任何人都将被忽略。

您可以通过保存来观察此行为Tasks 并在异常引发后检查它们await:

async static Task Test()
{
    Task containingTask, nullRefTask, argTask;
    try
    {
        containingTask = Task.Factory.StartNew(() =>
        {
            nullRefTask = Task.Factory.StartNew(() =>
            {
                throw new NullReferenceException();
            }, TaskCreationOptions.AttachedToParent);
            argTask = Task.Factory.StartNew(() =>
            {
                throw new ArgumentException();
            }, TaskCreationOptions.AttachedToParent);
        });
        await containingTask;
    }
    catch (AggregateException ex)
    {
        Console.WriteLine("** {0} **", ex.GetType().Name);
    }
}

如果你设置一个断点WriteLine,您可以看到两个子任务的异常都被放置在父任务上。这await运算符仅传播其中之一,因此这就是您只捕获其中之一的原因。

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

为什么子任务的许多异常中只传播其中之一? 的相关文章

  • 部署 MVC4 项目时出错:找不到文件或程序集

    过去 我只需使用 Visual Studio 2012 发布到 AWS 菜单项即可部署我的 MVC4 网站 到 AWS Elastic Beanstalk 现在 程序可以在本地编译并运行 但无法部署 从消息来看 它似乎正在寻找不在当前部署的
  • C++:无法使用scoped_allocator_adaptor传播polymorphic_allocator

    我有一个vector
  • 自动从 C# 代码进行调试过程并读取寄存器值

    我正在寻找一种方法来读取某个地址的 edx 注册表 就像这个问题中所问的那样 读取eax寄存器 https stackoverflow com questions 16490906 read eax register 虽然我的解决方案需要用
  • 如何在 Unity 中从 RenderTexture 访问原始数据

    问题的简短版本 我正在尝试访问 Unity 中 RenderTexture 的内容 我一直在使用 Graphics Blit 使用自己的材质进行绘制 Graphics Blit null renderTexture material 我的材
  • fgets() 和 Ctrl+D,三次才能结束?

    I don t understand why I need press Ctrl D for three times to send the EOF In addition if I press Enter then it only too
  • Cygwin 下使用 CMake 编译库

    我一直在尝试使用 CMake 来编译 TinyXML 作为一种迷你项目 尝试学习 CMake 作为补充 我试图将其编译成动态库并自行安装 以便它可以工作 到目前为止 我已经设法编译和安装它 但它编译成 dll 和 dll a 让它工作的唯一
  • 如何在我的应用程序中使用 Windows Key

    Like Windows Key E Opens a new Explorer Window And Windows Key R Displays the Run command 如何在应用程序的 KeyDown 事件中使用 Windows
  • 跨多个控件共享事件处理程序

    在我用 C 编写的 Windows 窗体应用程序中 我有一堆按钮 当用户的鼠标悬停在按钮上时 我希望按钮的边框发生变化 目前我有以下多个实例 每个按钮一个副本 private void btnStopServer MouseEnter ob
  • PHP 日志文件颜色

    我正在编写一个 PHP 日志文件类 但我想为写入文件的行添加颜色 我遇到的问题是颜色也会改变终端的颜色 我想要实现的是仅更改写入日志文件的行的颜色 class logClass extends Singleton private funct
  • c# Asp.NET MVC 使用FileStreamResult下载excel文件

    我需要构建一个方法 它将接收模型 从中构建excel 构建和接收部分完成没有问题 然后使用内存流导出 让用户下载它 不将其保存在服务器上 我是 ASP NET 和 MVC 的新手 所以我找到了指南并将其构建为教程项目 public File
  • HttpClient 像浏览器一样请求

    当我通过 HttpClient 类调用网站 www livescore com 时 我总是收到错误 500 可能服务器阻止了来自 HttpClient 的请求 1 还有其他方法可以从网页获取html吗 2 如何设置标题来获取html内容 当
  • 初始化变量的不同方式

    在 C 中初始化变量有多种方法 int z 3 与 int 相同z 3 Is int z z 3 same as int z z 3 您可以使用 int z z 3 Or just int z 3 Or int z 3 Or int z i
  • 可空属性与可空局部变量

    我对以下行为感到困惑Nullable types class TestClass public int value 0 TestClass test new TestClass Now Nullable GetUnderlyingType
  • 在 URL 中发送之前对特殊字符进行百分比编码

    我需要传递特殊字符 如 等 Facebook Twitter 和此类社交网站的 URL 为此 我将这些字符替换为 URL 转义码 return valToEncode Replace 21 Replace 23 Replace 24 Rep
  • 作为字符串的动态属性名称

    使用 DocumentDB 创建新文档时 我想设置属性名称动态地 目前我设置SomeProperty 像这样 await client CreateDocumentAsync dbs db colls x new SomeProperty
  • 已过时 - OpenCV 的错误模式

    我正在使用 OpenCV 1 进行一些图像处理 并且对 cvSetErrMode 函数 它是 CxCore 的一部分 感到困惑 OpenCV 具有三种错误模式 叶 调用错误处理程序后 程序终止 Parent 程序没有终止 但错误处理程序被调
  • 如何使用 ReactiveList 以便在添加新项目时更新 UI

    我正在创建一个带有列表的 Xamarin Forms 应用程序 itemSource 是一个reactiveList 但是 向列表添加新项目不会更新 UI 这样做的正确方法是什么 列表定义 listView new ListView var
  • 将变量分配给另一个变量,并将一个变量的更改反映到另一个变量中

    是否可以将一个变量分配给另一个变量 并且当您更改第二个变量时 更改会瀑布式下降到第一个变量 像这样 int a 0 int b a b 1 现在 b 和 a 都 1 我问这个问题的原因是因为我有 4 个要跟踪的对象 并且我使用名为 curr
  • 如何连接字符串和常量字符?

    我需要将 hello world 放入c中 我怎样才能做到这一点 string a hello const char b world const char C string a hello const char b world a b co
  • 不同类型的指针可以互相分配吗?

    考虑到 T1 p1 T2 p2 我们可以将 p1 分配给 p2 或反之亦然吗 如果是这样 是否可以不使用强制转换来完成 或者我们必须使用强制转换 首先 让我们考虑不进行强制转换的分配 C 2018 6 5 16 1 1 列出了简单赋值的约束

随机推荐

  • 无法在 iOS7 中使用自定义 RGBa 设置 barTintColor

    我的 viewDidLoad 中有一个简单的代码 可以更改 iOS7 中导航栏的颜色 if UINavigationBar instancesRespondToSelector selector barTintColor self navi
  • Android向图片添加文字并保存

    我想放置一个Textiew到我的图片并保存它 但我不知道如何将文本插入图片中 我可以在我的图片上附加图像保存它 它可以工作 但现在我想插入一个Textiew进入图片 这是我的代码 PictureCallback cameraPictureC
  • 移动目录中可能具有重复文件名的多个文件

    谁能帮我这个 我正在尝试将图像从 USB 复制到计算机上的存档中 我决定制作一个 BASH 脚本来简化这项工作 我想复制文件 即IMG 0101 JPG 如果存档中已经有一个具有该名称的文件 当我每次使用相机时都会擦拭它 则该文件应命名为I
  • 如何使用纹理贴图绘制曲面

    我想绘制一个带有纹理贴图的表面 但条件不是 理想 的 首先让我们解释一下我所拥有的 我在网格中有一组点 7000 它们是图像坐标 这一点并不能定义完美的平方 它不是网格 为了回答这个问题 我们假设我们有 9 分 让我们用图像来说明一下 X
  • 如何在android中创建数据库? [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我需要在 Android 中创建数据库的分步过程 数据库在编程中很重要 我们的许多代码总
  • 使用结构本身的值更新结构给出:“不能借用`*self`作为可变的,因为它也被借用为不可变的”

    我正在尝试创建一个struct修改它的current value通过附加一些 常量 字符串first step这是定义时struct首先被创建 code fn main let mut adder Adder current value i
  • 如何使用 JSON Web 服务填充 Android spinner?

    如何解析如下包含学校名称和 ID 的 JSON 文件 并使用 名称 字段中的值来填充微调器标签 我希望微调器将选定的 SchoolID 输出到下一个活动 例如 因此 您会看到 Hill View Elementary 如果您选择此选项 则值
  • 如何使用 asp.net Mvc 将文本值发送到我的控制器

    我是asp MVC新手 所以我将尝试使用ajax制作登录表单 所以我编写jsonresult来检查控制器中的用户名和密码 我在ajax中调用它 但当我写正确的用户名和密码时它不起作用显示在日志消息登录字段中 这是我的控制器代码 public
  • 如何让 MutationObserver 多次工作?

    我使用 MutationObserver 这样我就可以让 div 对变化做出反应 当它更改时 更改将显示在正下方的 div 中 但它只运行一次 如果我输入一些内容来 div 输入 div 则仅显示第一个字符 我在 MDN 上找到了这个 向元
  • 如何在 Tensorflow 中更新 2D 张量的子集?

    我想更新 2D 张量中值为 0 的索引 因此 data 是一个 2D 张量 其第二行第二列索引值将替换为 0 但是 我收到类型错误 有人可以帮我吗 类型错误 ScatterUpdate 操作的输入 ref 需要左值输入 data tf Va
  • 从其他常量构建常量变量列表

    我刚刚读完全部Objective C 全局常量变量问答 但我发现它们不适合我的问题 我需要一个像这样的变量列表 NSString baseURL http example org NSString mediaURL http example
  • 如何在PHP中使用换行符发送电子邮件

    请帮我在换行符中制作代码消息 我不知道该怎么做 请检查我的代码 希望你能帮助我 预先非常感谢
  • 使用全局变量会影响 MATLAB 的性能吗?

    据我了解 MATLAB不能使用pass by reference向其他函数发送参数时 我正在进行音频处理 并且经常需要将波形作为参数传递给函数 并且因为 MATLAB 使用pass by value对于这些论点 当我这样做时 它确实消耗了大
  • Spring Data REST:MongoDB 存储库的自定义查询

    我正在尝试创建一个自定义查询Spring 指南 使用 REST 访问 MongoDB 数据根据参考4 4 自定义实现 但我的自定义方法无法从存储库的 REST 接口 user search 中使用 例如浏览器无法找到 localhost 8
  • 保持 CSS 网格中列之间的比例。 grid-column是如何计算的?

    我希望我的网格保持一定的比例 但是长句子会增加它所属网格的宽度 body display grid main grid column 1 8 border 2px solid black aside grid column 8 13 bor
  • 将一张图像旋转到另一张图像下方

    我目前正在尝试旋转图像 然后在不旋转的顶部绘制图像 但每当我使用 g2d rotate Math toRadians rot x 15 y 15 我之后绘制的每张图像也会旋转 有什么方法可以旋转一张图像而不旋转其余图像 天哪 这真的很难解释
  • Delphi TWebBrowser 在 AJAX 加载后获取 HTML 源

    我有以下函数 可以在 DocumentComplete 事件之后获取 HTML 文档的源代码 function TBrowser GetWebBrowserHTML const WebBrowser TWebBrowser string v
  • javascript 中有 getElementsByClassName 吗?

    就像在 jQuery 中我们可以使用 classname 一样 在 javascript 中也有类似的东西吗 或者如果我们没有这样的方法那么我该如何实现它 根据http www dustindiaz com getelementsbycla
  • 在 Less 中将 px 转换为 em

    Scss 相当于什么emCalc 不到 padding emCalc 24px 在Scss中将根据视点和缩放级别计算em less中有内置函数吗 您可以这样做将 px 转换为 em font size 16 Your base font s
  • 为什么子任务的许多异常中只传播其中之一?

    我正在努力更好地掌握 TPL 中异常和错误处理的基本原理 并且在 NET 4 5 异步 等待任务中运气更好 The slightly modified from my earlier question How to better under