zoukankan      html  css  js  c++  java
  • 【转】编写高质量代码改善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个建议》陆敏技

  • 相关阅读:
    编程语言
    MySQL之常用函数
    Java常用工具类
    数据结构
    Java对接SAP平台接口
    Maven项目依赖管理工具
    Java设计模式--抽象工厂
    Java基础--抽象类与接口
    Java集合--ArrayList遍历删除元素
    Java注解(Annotation )--结合拦截器实现是否登录验证
  • 原文地址:https://www.cnblogs.com/farmer-y/p/7993904.html
Copyright © 2011-2022 走看看