当前位置: 首页 > news >正文

TPL - Part 2 异常处理常用方式

异常处理常用方式

Task task1 = new Task(() => {
ArgumentOutOfRangeException exception = new ArgumentOutOfRangeException();
exception.Source= "task1";
throw exception;
});
Task task2 = new Task(() => {
throw new NullReferenceException();
});
Task task3 = new Task(() => {
Console.WriteLine("Hello from Task 3");
});

task1.Start();task2.Start(); task3.Start();
try{
Task.WaitAll(task1,task2, task3);
} catch(AggregateException ex) {
//enumerate the exceptions that have been aggregated
foreach(Exception inner in ex.InnerExceptions) {
Console.WriteLine("Exception type {0} from {1}",
inner.GetType(),inner.Source);
}
}


以上代码中,创建了3个task,分别抛出不同的异常类型,在UI线程中使用AggregateException来GetType并获取Source来获得异常信息做不同的处理。

使用异常处理代理

在上述代码的catch中,可以使用如下代码完成通过代理处理异常:

try {
Task.WaitAll(task1, task2);
} catch (AggregateException ex) {
ex.Handle((inner) => {
if (inner is OperationCanceledException) {
// ...handle task cancellation...
return true;
} else {
return false;
}


上述代码使用了1个代理来接收每个AggregateException中的每个异常并进行处理。有关更多Task的属性还有Task.IsCompleted,Task.IsFaulted,Task.IsCanceled分别用于获取是否完成,是否出错,是否取消。

如果Task中的异常没有被处理,那么在Task被回收时程序会被终止,由于Task被回收的时间不能确定,程序终止的时间也不能确定,因此一定要处理好Task中的异常。

在全局范围处理Task遗漏的异常

TaskScheduler.UnobservedTaskException +=
(object sender, UnobservedTaskExceptionEventArgs eventArgs) =>
{
eventArgs.SetObserved();
((AggregateException)eventArgs.Exception).Handle(ex=> {
//addlog here
Console.WriteLine("Exception type: {0}, Source : {1}", ex.GetType(), ex.Source);
return true;
});
};
//create tasks that will throw an exception
Task task1 = new Task(() => {
throw new NullReferenceException();
});
Task task2 = new Task(() => {
throw new ArgumentOutOfRangeException();
});
// startthe tasks
task1.Start();task2.Start();
 
while(!task1.IsCompleted || !task2.IsCompleted){
Thread.Sleep(200);
}


以上代码中,开启了两个Task,并在TaskScheduler中捕捉Task中没有捕捉到的异常。

相关文章:

  • 一个关于TCHAR的离奇bug
  • C# 使用Xamarin 开发应用 -- 切换Activity
  • Vsual Studio2005打开速度很慢的超级解决方案
  • OO系统分析员之路--用例分析系列(7)--用例规约的编写--业务规则和实体描述[整理重发]...
  • 批量删除多台服务器上的漫游用户配置文件
  • div 长度固定 文字太长实现自动换行
  • 金旭亮博客之“Web开发技术”资源主页
  • TPL Part3 -- 数据共享
  • 如何做软件项目的需求分析....
  • C# Asp.net MVC 分页时传参场景 动态生成QueryString
  • [Windows编程] 使用API函数GetProcAddress的注意事项
  • TPL Part 4 -- Task的协同
  • [Windows编程] SHLWAPI 和 CRT (C Runtime) 字符串处理函数的区别
  • SSH用户等效性配置
  • TPL Part5 -- 循环和PLINQ
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • CSS中外联样式表代表的含义
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • JAVA 学习IO流
  • Java精华积累:初学者都应该搞懂的问题
  • JS变量作用域
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • Python爬虫--- 1.3 BS4库的解析器
  • Transformer-XL: Unleashing the Potential of Attention Models
  • Vue2 SSR 的优化之旅
  • vue--为什么data属性必须是一个函数
  • 对象引论
  • 工程优化暨babel升级小记
  • 猴子数据域名防封接口降低小说被封的风险
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 智能合约开发环境搭建及Hello World合约
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (十八)SpringBoot之发送QQ邮件
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (转)http-server应用
  • (转)linux下的时间函数使用
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .NET大文件上传知识整理
  • /etc/skel 目录作用
  • [BT]小迪安全2023学习笔记(第15天:PHP开发-登录验证)
  • [C puzzle book] types
  • [C/C++]数据结构----顺序表的实现(增删查改)
  • [gdc19]《战神4》中的全局光照技术
  • [hdu2196]Computer树的直径
  • [hihocoder1395] 最大权闭合子图
  • [HJ73 计算日期到天数转换]