1. 程式人生 > >Task中出現的異常AggregateException

Task中出現的異常AggregateException

star 並行編程 tee start source each main gate all

static void Main(string[] args)  
{  
    Task t = new Task(() =>
        {  
            throw new Exception("任務並行編碼中產生的未知異常");  
        });  
    t.Start();  
 
    try  
    {  
        //若有Result,可求Result  
        t.Wait();  
    }  
    catch (AggregateException e)  
    {  
        foreach (var item in e.InnerExceptions)  
        {  
            Console.WriteLine("異常類型:{0}{1}來自:{2}{3}異常內容:{4}", item.GetType(), Environment.NewLine,  
 item.Source, Environment.NewLine, item.Message);  
        }  
    }  
    Console.WriteLine("主線程馬上結束");  
    Console.ReadKey();  
} 

在任何時候,異常處理都是非常重要的一個環節。多線程與並行編程中尤其是這樣。如果不處理這些後臺任務中的異常,應用程序將會莫名其妙的退出。處理那些不是主線程(如果是窗體程序,那就是UI主線程)產生的異常,最終的辦法都是將其包裝到主線程上。

在任務並行庫中,如果對任務運行Wait、WaitAny、WaitAll等方法,或者求Result屬性,都能捕獲到AggregateException異常。可以將AggregateException異常看做是任務並行庫編程中最上層的異常。在任務中捕獲的異常,最終都應該包裝到AggregateException中。一個任務並行庫異常的簡單處理示例。

Task中出現的異常AggregateException