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个建议》陆敏技

  • 相关阅读:
    ORACLE存储过程调用Web Service
    企业管理应具备哪些软件
    ZROI Day6比赛总结
    UOJ 449 【集训队作业2018】喂鸽子 【生成函数,min-max容斥】
    Atcoder Rating System
    Luogu4688 [Ynoi2016]掉进兔子洞 【莫队,bitset】
    UOJ450 【集训队作业2018】复读机【生成函数】
    Luogu5071 [Ynoi2015]此时此刻的光辉 【莫队】
    Luogu4689 [Ynoi2016]这是我自己的发明 【莫队】
    CF891C Envy【最小生成树】
  • 原文地址:https://www.cnblogs.com/farmer-y/p/7993904.html
Copyright © 2011-2022 走看看