寫在前面
當Task在執行過程中出現異常或被取消等例外的情況時,為了讓執行流程能夠繼續進行,可以使用延續方法實現這種鏈式處理;還可以針對前置任務不同的執行結果,選擇執行不同的延續分支方法。子任務執行過程中的任何異常都會被傳遞到延續方法中進行統一處理,因此而增強了對并行任務的流程控制。
代碼實現
public static void ContinueWithException(){TaskCreationOptions tco = TaskCreationOptions.AttachedToParent;Task task = Task.Factory.StartNew(() =>{Task.Factory.StartNew(() => { throw new Exception(Environment.NewLine + "first exception" + Environment.NewLine); }, tco);Task.Factory.StartNew(() => { throw new Exception(Environment.NewLine + "second exception" + Environment.NewLine); }, tco);Task.Factory.StartNew(() => { throw new Exception(Environment.NewLine + "third exception" + Environment.NewLine); }, tco);}).ContinueWith(t => Console.WriteLine("Message:" + t.Exception.Message + Environment.NewLine), TaskContinuationOptions.OnlyOnFaulted);task.Wait();Task task01 = Task.Factory.StartNew(() =>{Console.WriteLine("task01 executed.");});Task ok1 = task01.ContinueWith(t => Console.WriteLine("Ok"), TaskContinuationOptions.NotOnFaulted);Task fail1 = task01.ContinueWith(t => Console.WriteLine("Failure:" + t.Exception.Message), TaskContinuationOptions.OnlyOnFaulted);Task task02 = Task.Factory.StartNew(() =>{throw new Exception("task02 executed.");});Task ok2 = task02.ContinueWith(t => Console.WriteLine("Ok"), TaskContinuationOptions.NotOnFaulted);Task fail2 = task02.ContinueWith(t => Console.WriteLine("Failure:" + t.Exception.Message), TaskContinuationOptions.OnlyOnFaulted);}
調用結果
如圖,子任務中分別拋出的三個異常信息都被傳遞到了延續方法中,程序依然可以繼續執行;另外task01和task02分別根據執行情況進入了不同的延續分支方法。