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

  • 相关阅读:
    iOS的一些面试题分析总结(1)
    iOS的一些面试题分析总结(0)
    iOS页面间传值的一些方式总结
    自定义UIButton
    iOS查看3D效果的手势交互
    关于php得到参数数据
    ios安装ipa与安卓安装apk
    听说程序员想当就能当?
    W5100S、W5500、W5100差异对比
    annot read lifecycle mapping metadata for artifact org.apache.maven.plugins:maven-clean-plugin:maven
  • 原文地址:https://www.cnblogs.com/farmer-y/p/7993904.html
Copyright © 2011-2022 走看看