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

  • 相关阅读:
    那么 Appium 到底是怎么工作的呢?
    最小的 Velocity 教程
    CentOS 7 使用经验(更新中)
    [TL-WR841N V5~V9] 如何当作无线交换机使用?
    VS2012打包部署Winform程序
    ASP.NET 应用程序生命周期概述[转自MSDN]
    (翻译)从底层了解ASP.NET体系结构 [转]
    .NET在IE9中页面间URL传递中文变成乱码的解决办法
    终于把你必须知道的.NET看完了
    装箱与拆箱的操作与内存管理
  • 原文地址:https://www.cnblogs.com/jesselzj/p/4743476.html
Copyright © 2011-2022 走看看