Task中出現的異常AggregateException
阿新 • • 發佈:2017-10-25
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