1. 程式人生 > >C#多執行緒程式設計筆記(5.5)-處理非同步操作中的異常

C#多執行緒程式設計筆記(5.5)-處理非同步操作中的異常

近來在學習Eugene Agafonov編寫的《C#多執行緒程式設計實戰》(譯),做些筆記也順便分享一下^-^

本篇將描述在C#中使用非同步函式時如何處理異常。我們將學習對多個並行的非同步操作使用await時如何聚合異常。

using System;
using System.Threading.Tasks;

namespace 處理非同步操作中的異常
{
    class Program
    {
        static void Main(string[] args)
        {
            Task t = AsynchronousProcessing();
            t.Wait();

            Console.ReadKey();
        }

        async static Task AsynchronousProcessing()
        {
            Console.WriteLine("1.Single exception");

            try
            {
                string result = await GetInfoAsync("Task 1", 2);
                Console.WriteLine(result);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Exception details: {0}", ex);
            }

            Console.WriteLine();
            Console.WriteLine("2.Multiple exception");

            Task<string> t1 = GetInfoAsync("Task 1", 3);
            Task<string> t2 = GetInfoAsync("Task 2", 2);
            try
            {
                string[] result = await Task.WhenAll(t1, t2);
                Console.WriteLine(result.Length);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Exception details: {0}", ex);
            }

            Console.WriteLine();
            Console.WriteLine("2.Multiple exception with AggregateException");

            t1 = GetInfoAsync("Task 1", 3);
            t2 = GetInfoAsync("Task 2", 2);
            Task<string[]> t3 = Task.WhenAll(t1, t2);
            try
            {
                string[] results = await t3;
                Console.WriteLine(results);
            }
            catch (Exception ex)
            {
                var ae = t3.Exception.Flatten();
                var exceptions = ae.InnerExceptions;
                Console.WriteLine("Exception caught: {0}", exceptions.Count);
                foreach (var item in exceptions)
                {
                    Console.WriteLine("Exception details: {0}", item);
                    Console.WriteLine();
                }
            }
        }

        async static Task<string> GetInfoAsync(string name,int seconds)
        {
            await Task.Delay(TimeSpan.FromSeconds(seconds));
            throw new Exception(string.Format("Boom from {0}", name));
        }
    }
}

程式碼執行結果如下:


我們運行了三個場景來展示在C#中使用async和await時關於錯誤處理的最常見情況。第一種情況是最簡單的,並且與常見的同步程式碼幾乎完全一樣。我們只使用try/catch宣告即可獲取異常細節。

一個很常見的錯誤是對一個以上的非同步操作使用await時還使用以上方式。如果仍像第一種情況一樣使用catch程式碼塊,則只能從底層的AggregateException物件中得到第一個異常。

為了收集所有異常資訊,可以使用await任務的Exception屬性。在第三種情況中,我們使用AggregateException的Flattern方法將層級異常放人一個列表,並且從中提取出所有的底層異常。

相關推薦

C#執行程式設計筆記(4.4)-處理Task任務異常

近來在學習Eugene Agafonov編寫的《C#多執行緒程式設計實戰》(譯),做些筆記也順便分享一下^-^ using System; using System.Threading.Tasks; using System.Threading; namespace 處理任

C#執行程式設計筆記(2.5)-使用CountDownEvent類

近來在學習Eugene Agafonov編寫的《C#多執行緒程式設計實戰》(譯),做些筆記也順便分享一下^-^using System; using System.Threading; namespace CountDownEvent_Test { class Pr

C#執行程式設計筆記(5.2)-在lambda表示式使用await操作符

近來在學習Eugene Agafonov編寫的《C#多執行緒程式設計實戰》(譯),做些筆記也順便分享一下^-^using System; using System.Threading.Tasks; using System.Threading; namespace 在Lam

C#執行程式設計筆記(5.5)-處理非同步操作異常

近來在學習Eugene Agafonov編寫的《C#多執行緒程式設計實戰》(譯),做些筆記也順便分享一下^-^本篇將描述在C#中使用非同步函式時如何處理異常。我們將學習對多個並行的非同步操作使用await時如何聚合異常。using System; using System.T

C#執行程式設計筆記(2.7)-使用ReaderWriterLockSlim類

近來在學習Eugene Agafonov編寫的《C#多執行緒程式設計實戰》(譯),做些筆記也順便分享一下^-^using System; using System.Collections.Generic; using System.Threading; namespace

C#執行程式設計筆記(2.1)-使用Mutex類

近來在學習Eugene Agafonov編寫的《C#多執行緒程式設計實戰》(譯),做些筆記也順便分享一下^-^Mutex是一種原始的同步方法,其只對一個執行緒授予對共享資源的獨佔訪問using System; using System.Threading; namespac

C#執行程式設計筆記(1.2)-檢測執行狀態State

近來在學習Eugene Agafonov編寫的《C#多執行緒程式設計實戰》(譯),做些筆記也順便分享一下^-^using System; using System.Threading; namespace 檢測執行緒狀態 { class Program {

c#執行程式設計筆記4

a)使用Monitor類 Monitor類提供了鎖定部分程式碼的簡單機制,只要把受保護的程式碼包裝在Monitor.Enter與Monitor.Exit程式碼塊中就行了。Monitor.Enter方法與Monitor.Exit方法都有一個引數。 Monitor.Enter(o

c#執行程式設計筆記2

第三部分執行緒的同步 同步的意思是在多執行緒程式中,為了使兩個或多個執行緒之間,對分配臨界資源的分配問題,要如何分配才能使臨界資源在為某一執行緒使用的時候,其它執行緒不能再使用,這樣可以有效地避免死鎖與髒資料。髒資料是指兩個執行緒同時使用某一資料,造成這個資料出現不可預知的狀

C#執行程式設計筆記(2.6)-使用Barrier類

近來在學習Eugene Agafonov編寫的《C#多執行緒程式設計實戰》(譯),做些筆記也順便分享一下^-^using System; using System.Threading; namespace Barrier_Test { class Program

C#執行程式設計筆記(2.8)-使用SpinWait類

近來在學習Eugene Agafonov編寫的《C#多執行緒程式設計實戰》(譯),做些筆記也順便分享一下^-^using System; using System.Threading; namespace SpinWait_Test { class Program

Java執行程式設計筆記2:synchronized同步方法

非執行緒安全會在多個執行緒對同一個物件中的例項變數進行併發訪問時發生,產生的結果就是髒讀,也就是取到的資料是被更改過的。執行緒安全就是獲得的例項變數的值是經過同步處理的。 方法內的變數是執行緒安全的 方法內的變數是執行緒安全的。非執行緒安全的問題存在於例項變數中,如果是方法內部的私有變數,不存在非執行緒安

理解c++執行程式設計

多執行緒程式設計 本篇博文不是主要介紹互斥鎖之類的,是理解執行緒的執行,以便以後有把握的寫多執行緒程式。 #include<thread> #include<iostream&g

Java執行程式設計筆記10:單例模式

立即載入:“餓漢模式” 立即載入就是指使用類的時候已經將物件建立完畢,常見的實現方法就是直接new例項化。也就是在呼叫方法前,例項就被建立了。示例程式碼如下所示: class MyObject { private static MyObject myObject=new MyObject();

Linux c執行程式設計的4個例項

在主流的作業系統中,多工一般都提供了程序和執行緒兩種實現方式,程序享有獨立的程序空間,而執行緒相對於程序來說是一種更加輕量級的多工並行,多執行緒之間一般都是共享所在程序的記憶體空間的。   Linux也不例外,雖然從核心的角度來看,執行緒體現為一種對程序的"克隆"(clon

C++執行筆記1

來源:C++ 11 多執行緒 課程介紹 併發:同一時間間隔 並行:同一時刻 多程序:程序間通訊:檔案、管道、訊息佇列 多程序:共享記憶體 C++多執行緒庫<thread> 建立一個執行緒 thread t(callable); 其中callable為可呼叫物件

Linux C 執行程式設計總結

執行緒的資料處理   和程序相比,執行緒的最大優點之一是資料的共享性,各個程序共享父程序處沿襲的資料段,可以方便的獲得、修改資料。但這也給多執行緒程式設計帶來了許多問題。我們必須當心有多個不同的程序訪問相同的變數。許多函式是不可重入的,即同時不能執行一個函式的多個拷貝(除非使用不同的資料段)。在函式中宣告的

C++執行程式設計學習(1)】-CPU個數、CPU核心數、CPU執行

轉自:CPU個數、CPU核心數、CPU執行緒數(by kimsimple)   CPU個數即CPU晶片個數。 CPU核心數是指物理上,也就是硬體上存在著幾個核心。比如,雙核就是包括2個相對獨立的CPU核心單元組,四核就包含4個相對獨立的CPU核心單元組。 CPU執行緒數是一

【Linux C 執行程式設計】互斥鎖與條件變數

一、互斥鎖互斥量從本質上說就是一把鎖, 提供對共享資源的保護訪問。  1. 初始化:  在Linux下, 執行緒的互斥量資料型別是pthread_mutex_t. 在使用前, 要對它進行初始化:  對於靜態分配的互斥量, 可以把它設定為PTHREAD_MUTEX_INITIA

樹莓派3B Linux下C++執行程式設計

下面的程式碼手動建立了兩個執行緒,一個執行緒是讀取串列埠的資料,另一個執行緒是通過UDP來讀取網路通訊收到的資料。加上main函式的執行緒,一共三個執行緒。 先簡單講一下多執行緒的建立, pthread_t serial; int ser =