如果调用两个异步方法,每个都会抛出异常,该如何处理呢 ? 在下面的示例中,第一个 ThrowAfter 方法被调用,2s 后抛出异常(含消息 first)。该方法结束后,另一个 ThrowAfter 方法也被调用,1s 后也抛出异常。事实并非如此,因为对第一个 ThrowAfter 方法的调用已经抛出了异常,try 块内的代码没有继续调用第二个 ThrowAfter 方法,而是在 catch 块内对第一个异常进行处理。

代码如下:

private static async void StartTwoTasks()
{try{await ThrowAfter(2000, "first");await ThrowAfter(1000,  "second"); // the second call is not invoked// because the first method throws// an exception}catch (Exception ex){Console.WriteLine($"handled  {ex.Message}");}
}

现在,并行调用这两个 ThrowAfter 方法。第一个 ThrowAfter 方法 2s 后抛出异常,1s 后第二个 ThrowAfter 方法也抛出异常。使用 Task.WhenAll,不管任务是否抛出异常,都会等到两个任务完成。因此,等待 2s 后, Task.WhenAll 结束,异常被 catch 语句捕获到。但是,只能看见传递给 WhenAll 方法的第一个任务的异常信息,没有显示先抛出异常的任务(第二个任务),但该任务也在列表中:

代码如下:

private async static void StartTwoTasksParallel()
{try{Task tl = ThrowAfter(2000, "first");Task t2 = ThrowAfter(1000, "second");await Task.WhenAll(tl, t2);}catch (Exception ex){// just display the exception information of the first task// that is awaited within whenAllConsole.WriteLine(S"handled {ex.Message}");}
}

有一种方式可以获取所有任务的异常信息,就是在 try 块外声明任务变量 t1 和t2,使它们可以在 catch 块内访问。在这里,可以使用 IsFaulted 属性检查任务的状态,以确认它们是否为出错状态。若出现异常,IsFaulted 属性会返回true。可以使用 Task 类的 Exception.InnerException 访问异常信息本身。

C# 多个异步方法的异常处理相关推荐

  1. C# 异步方法的异常处理

    在使用异步方法时,应该知道错误的一些特殊处理方式.所有 ErrorHandling 示例的代码都使用了如下名称空间: System System.Threading.Tasks 从一个简单的方法开始, ...

  2. 异步编程(asyncawait)

    前言 本来这篇文章上个月就该发布了,但是因为忙 QuarkDoc  一直没有时间整理,所以耽搁到今天,现在回归正轨. C# 5.0 虽然只引入了2个新关键词:async和await.然而它大大简化了异 ...

  3. Spring Boot系列二 Spring @Async异步线程池用法总结

    转载 自 https://blog.csdn.net/hry2015/article/details/67640534 1. TaskExecutor Spring异步线程池的接口类,其实质是java ...

  4. 持续畅销20年的《C#高级编程》出第11版了!

    TA是谁? Wrox精品红皮书, 引领无数程序员进入程序开发殿堂, C#专家级指南, 是经验丰富的程序员提高效率的更快捷方式,   连续畅销20年,累计销量超30万册. TA出生名门:  TA战绩辉煌 ...

  5. 异常处理汇总-后端系列

    异常处理汇总:http://www.cnblogs.com/dunitian/p/4599258.html Python:https://www.cnblogs.com/dotnetcrazy/p/9 ...

  6. @async注解_SpringBoot中Async异步方法和定时任务介绍

    1.功能说明 Spring提供了Async注解来实现方法的异步调用.即当调用Async标识的方法时,调用线程不会等待被调用方法执行完成即返回继续执行以下操作,而被调用的方法则会启动一个独立线程来执行此 ...

  7. SpringBoot中使用异步方法优化Service逻辑,提高接口响应速度

    点击关注公众号,实用技术文章及时了解 来源:blog.csdn.net/weixin_43441509/ article/details/119855613 1. 为什么需要异步方法? 先说结论: 合 ...

  8. async spring 默认线程池_SpringBoot中Async异步方法和定时任务介绍

    1.功能说明 Spring提供了Async注解来实现方法的异步调用.即当调用Async标识的方法时,调用线程不会等待被调用方法执行完成即返回继续执行以下操作,而被调用的方法则会启动一个独立线程来执行此 ...

  9. Vue实现全局异常处理的几种方案

    Vue实现全局异常处理的几种方案 在开发组件库或者插件,经常会需要进行全局异常处理,从而实现: 全局统一处理异常: 为开发者提示错误信息: 方案降级处理等等. 那么如何实现上面功能呢?本文先简单实现一 ...

最新文章

  1. 史上最全开源中文 NLP 数据集:包括10大类、142条数据源,总有你钟意的那一款!...
  2. Object.defineProperty的理解
  3. Quartz-2D绘图之路径(Paths)详解
  4. 卡尔曼滤波器原理和matlab实现
  5. jQuery 阻止冒泡和默认事件
  6. ios开发跳转safari_阻止iOS Web APP中点击链接跳转到Safari 浏览器新标签页
  7. Android 说说亮屏锁和键盘锁
  8. 洛谷 P2596 [ZJOI2006]书架 解题报告
  9. VMWare MAC系统调整磁盘
  10. mysql数据库总览_MySQL架构总览-查询执行流程-SQL解析顺序
  11. mysql 表锁的概念_MySQL 锁的一些简单概念
  12. URL请求到Action的映射规则
  13. 【转】Apache配置正向代理与反向代理
  14. 一个实际使用的容灾方案
  15. 接水果(fruit)——整体二分+扫描线
  16. 为工大瑞普新编写的CCNA实验手册提供下载
  17. EasyGBS对GB35114的支持
  18. 人工智能学习资源汇总
  19. N阶行列式计算(JAVA)
  20. 【ICML 2020联邦学习论文解读】SCAFFOLD: Stochastic Controlled Averaging for Federated Learning

热门文章

  1. Windows下安装BeautifulSoup
  2. [MySQL] 分组排序取前N条记录以及生成自动数字序列,类似group by后 limit
  3. 为什么启动hbase shell后,创建按create 'test', 'cf'失败?
  4. 几个想法,有兴趣的可以深入下去
  5. unix高级编程apue.h问题
  6. jQuery 1.9.1中live()变更
  7. sql学习笔记---公用表达式(CTE)
  8. 【BZOJ】【4145】【AMPPZ2014】The Prices
  9. [for循环之等腰三角形]
  10. Android学习笔记(1)