建议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中的异常处理相关推荐

  1. 编写高质量代码改善C#程序的157个建议——建议148:不重复代码

    建议148:不重复代码 如果发现重复的代码,则意味着我们需要整顿一下,在继续前进. 重复的代码让我们的软件行为不一致.举例来说,如果存在两处相同的加密代码.结果在某一天,我们发现加密代码有个小Bug, ...

  2. 编写高质量代码改善C#程序的157个建议——建议87:区分WPF和WinForm的线程模型...

    建议87:区分WPF和WinForm的线程模型 WPF和WinForm窗体应用程序都有一个要求,那就是UI元素(如Button.TextBox等)必须由创建它的那个线程进行更新.WinForm在这方面 ...

  3. 编写高质量代码改善C#程序的157个建议——建议127:用形容词组给接口命名

    建议127:用形容词组给接口命名 接口规范的是"Can do",也就是说,它规范的是类型可以具有哪些行为.所以,接口的命名应该是一个形容词,如: IDisposable表示可以被释 ...

  4. 编写高质量代码改善C#程序的157个建议——建议133:用camelCasing命名私有字段和局部变量...

    建议133:用camelCasing命名私有字段和局部变量 私有变量和局部变量只对本类型负责,它们在命名方式也采用和开放的属性及字段不同的方法.camelCasing很适合这类命名. camelCas ...

  5. 编写高质量代码改善C#程序的157个建议——建议104:用多态代替条件语句

    建议104:用多态代替条件语句 假设要开发一个自动驾驶系统.在设计之初,此自动驾驶系统拥有一个驾驶系统命令的枚举类型: enum DriveCommand{Start,Stop} 当前该枚举存在两个命 ...

  6. 编写高质量代码改善C#程序的157个建议——建议157:从写第一个界面开始,就进行自动化测试...

    建议157:从写第一个界面开始,就进行自动化测试 如果说单元测试是白盒测试,那么自动化测试就是黑盒测试.黑盒测试要求捕捉界面上的控件句柄,并对其进行编码,以达到模拟人工操作的目的.具体的自动化测试请学 ...

  7. 编写高质量代码改善C#程序的157个建议——建议130:以复数命名枚举类型,以单数命名枚举元素...

    建议130:以复数命名枚举类型,以单数命名枚举元素 枚举类型应该具有负数形式,它表达的是将一组相关元素组合起来的语义.比如: enum Week{Monday,Tuesday,Wednesday,Th ...

  8. 编写高质量代码改善C#程序的157个建议——建议50:在Dispose模式中应区别对待托管资源和非托管资源...

    建议50:在Dispose模式中应区别对待托管资源和非托管资源 真正资源释放代码的那个虚方法是带一个bool参数的,带这个参数,是因为我们在资源释放时要区别对待托管资源和非托管资源. 提供给调用者调用 ...

  9. 编写高质量代码改善C#程序的157个建议——建议9: 习惯重载运算符

    建议9: 习惯重载运算符 在开发过程中,应该习惯于使用微软提供给我们的语法特性.我想每个人都喜欢看到这样的语法特性: int x = 1; int y = 2; int total = x + y; ...

最新文章

  1. OpenCV代码提取:遍历指定目录下指定文件的实现
  2. [LeetCode 001] Two Sum
  3. python与图书编辑
  4. vue之filter用法
  5. [转]Android 代码混淆和加固 so库 简单教你一行代码实现
  6. oracle常见单词_Oracle中常见的英语单词
  7. Java学习系列(十九)Java面向对象之数据库编程
  8. [雪峰磁针石博客]python 3.7极速入门教程1安装:Linux(Ubuntu 18.04)及Windows上安装Anaconda...
  9. 自动控制原理基础学习
  10. “kuangbin带你飞”专题计划——专题十五 数位DP
  11. 零基础怎么自学日语?
  12. 三组计算机局域网组网方案,多种方式组建家庭局域网
  13. Niushop官网出新版 由内而外 玩转简约时尚风
  14. springBoot项目中yml文件${REDIS_HOST:127.0.0.1}写法解析
  15. 0.1+0.2 等于 0.3 吗?
  16. 浏览器旧版本下载地址汇总——持续更新
  17. 把微信做成找券机器人,淘宝查券返利小助手实现方法分享
  18. 【pandas】教程:1-处理什么样的数据
  19. RabbitMQ开发工具包
  20. [典故收集]氪金狗眼

热门文章

  1. 编译Linux Kernel(linux-4.19.178)并制作成rpm文件
  2. 如何使用JavaScript Math.floor生成范围内的随机整数-已解决
  3. python字典{:4}_Python字典101:详细的视觉介绍
  4. 途游斗地主加密协议分析及破解
  5. 利用Nginx实现简易负载均衡
  6. 【HTTP协议】域名
  7. 唐山松下焊接机器人编程招聘_机器人四小家族-松下Panasonic专注焊接
  8. bat 将war文件转换成ear文件
  9. 《复联4》的这波操作,其实是在灭 bug
  10. GDB 调试 Mysql 实战(二)GDB 调试打印