编写高质量代码改善C#程序的157个建议——建议86:Parallel中的异常处理
建议86:Parallel中的异常处理
建议85阐述了如何处理Task中的异常。由于Task的Start方法是异步启动的,所以我们需要额外的技术来完成异常处理。Parallel相对来说就要简单很多,因为Parallel的调用者线程会等到所有的任务全部完成后,再继续自己的工作。简单来说,它具有同步的特性,所以,用下面的这段代码就可以实现将并发异常包装到主线程中:
static void Main(string[] args) { try { var parallelExceptions = new ConcurrentQueue<Exception>(); Parallel.For(0, 1, (i) =>{ try { throw new InvalidOperationException("并行任务中出现的异常"); } catch (Exception e) { parallelExceptions.Enqueue(e); } if (parallelExceptions.Count > 0) throw new AggregateException(parallelExceptions); }); } catch (AggregateException err) { foreach (Exception item in err.InnerExceptions) { Console.WriteLine("异常类型:{0}{1}来自: {2}{3}异常内容:{4}", item.InnerException.GetType(), Environment.NewLine, item.InnerException.Source, Environment.NewLine, item.InnerException.Message); } } Console.WriteLine("主线程马上结束"); Console.ReadKey(); }
这段代码的输出为:
异常类型:System.InvalidOperationException
来自:ConsoleApplication2
异常内容:并行任务中出现的异常
主线程马上结束
在Parallel的异常处理中,我们使用了一个线程安全的泛型集合ConcurrentQueue<T>来处理并发中有可能会遇到的集合线程安全性问题(参见建议22:确保集合的线程安全)。
转自:《编写高质量代码改善C#程序的157个建议》陆敏技
转载于:https://www.cnblogs.com/jesselzj/p/4743476.html
编写高质量代码改善C#程序的157个建议——建议86:Parallel中的异常处理相关推荐
- 编写高质量代码改善C#程序的157个建议——建议148:不重复代码
建议148:不重复代码 如果发现重复的代码,则意味着我们需要整顿一下,在继续前进. 重复的代码让我们的软件行为不一致.举例来说,如果存在两处相同的加密代码.结果在某一天,我们发现加密代码有个小Bug, ...
- 编写高质量代码改善C#程序的157个建议——建议87:区分WPF和WinForm的线程模型...
建议87:区分WPF和WinForm的线程模型 WPF和WinForm窗体应用程序都有一个要求,那就是UI元素(如Button.TextBox等)必须由创建它的那个线程进行更新.WinForm在这方面 ...
- 编写高质量代码改善C#程序的157个建议——建议127:用形容词组给接口命名
建议127:用形容词组给接口命名 接口规范的是"Can do",也就是说,它规范的是类型可以具有哪些行为.所以,接口的命名应该是一个形容词,如: IDisposable表示可以被释 ...
- 编写高质量代码改善C#程序的157个建议——建议133:用camelCasing命名私有字段和局部变量...
建议133:用camelCasing命名私有字段和局部变量 私有变量和局部变量只对本类型负责,它们在命名方式也采用和开放的属性及字段不同的方法.camelCasing很适合这类命名. camelCas ...
- 编写高质量代码改善C#程序的157个建议——建议104:用多态代替条件语句
建议104:用多态代替条件语句 假设要开发一个自动驾驶系统.在设计之初,此自动驾驶系统拥有一个驾驶系统命令的枚举类型: enum DriveCommand{Start,Stop} 当前该枚举存在两个命 ...
- 编写高质量代码改善C#程序的157个建议——建议157:从写第一个界面开始,就进行自动化测试...
建议157:从写第一个界面开始,就进行自动化测试 如果说单元测试是白盒测试,那么自动化测试就是黑盒测试.黑盒测试要求捕捉界面上的控件句柄,并对其进行编码,以达到模拟人工操作的目的.具体的自动化测试请学 ...
- 编写高质量代码改善C#程序的157个建议——建议130:以复数命名枚举类型,以单数命名枚举元素...
建议130:以复数命名枚举类型,以单数命名枚举元素 枚举类型应该具有负数形式,它表达的是将一组相关元素组合起来的语义.比如: enum Week{Monday,Tuesday,Wednesday,Th ...
- 编写高质量代码改善C#程序的157个建议——建议50:在Dispose模式中应区别对待托管资源和非托管资源...
建议50:在Dispose模式中应区别对待托管资源和非托管资源 真正资源释放代码的那个虚方法是带一个bool参数的,带这个参数,是因为我们在资源释放时要区别对待托管资源和非托管资源. 提供给调用者调用 ...
- 编写高质量代码改善C#程序的157个建议——建议9: 习惯重载运算符
建议9: 习惯重载运算符 在开发过程中,应该习惯于使用微软提供给我们的语法特性.我想每个人都喜欢看到这样的语法特性: int x = 1; int y = 2; int total = x + y; ...
最新文章
- OpenCV代码提取:遍历指定目录下指定文件的实现
- [LeetCode 001] Two Sum
- python与图书编辑
- vue之filter用法
- [转]Android 代码混淆和加固 so库 简单教你一行代码实现
- oracle常见单词_Oracle中常见的英语单词
- Java学习系列(十九)Java面向对象之数据库编程
- [雪峰磁针石博客]python 3.7极速入门教程1安装:Linux(Ubuntu 18.04)及Windows上安装Anaconda...
- 自动控制原理基础学习
- “kuangbin带你飞”专题计划——专题十五 数位DP
- 零基础怎么自学日语?
- 三组计算机局域网组网方案,多种方式组建家庭局域网
- Niushop官网出新版 由内而外 玩转简约时尚风
- springBoot项目中yml文件${REDIS_HOST:127.0.0.1}写法解析
- 0.1+0.2 等于 0.3 吗?
- 浏览器旧版本下载地址汇总——持续更新
- 把微信做成找券机器人,淘宝查券返利小助手实现方法分享
- 【pandas】教程:1-处理什么样的数据
- RabbitMQ开发工具包
- [典故收集]氪金狗眼
热门文章
- 编译Linux Kernel(linux-4.19.178)并制作成rpm文件
- 如何使用JavaScript Math.floor生成范围内的随机整数-已解决
- python字典{:4}_Python字典101:详细的视觉介绍
- 途游斗地主加密协议分析及破解
- 利用Nginx实现简易负载均衡
- 【HTTP协议】域名
- 唐山松下焊接机器人编程招聘_机器人四小家族-松下Panasonic专注焊接
- bat 将war文件转换成ear文件
- 《复联4》的这波操作,其实是在灭 bug
- GDB 调试 Mysql 实战(二)GDB 调试打印