首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

.NET 並行程式設計系列(五):Task 等待完成與例外處理機制

     編輯:關於.NET

掌握 Task 等待模式與標準化例外處理,是撰寫健壯並行程式的關鍵。

等待模式三種

1. 等待單一 Task

task.Wait();                    // 無限期等待
task.Wait(2000);                // 等待 2 秒,回傳 bool 是否完成
task.Wait(2000, token);         // 可攜帶 CancellationToken

注意:Task 內部拋出例外會在 Wait() 重新拋出。

2. 等待多個 Task 全部完成

Task.WaitAll(task1, task2);           // 全部完成才返回
Task.WaitAll(tasks, 5000);            // 含逾時
Task.WaitAll(tasks, token);           // 可取消等待

任一 Task 失敗/取消/拋出例外,WaitAll 即拋出 AggregateException。

3. 等待任意一個 Task 完成

int index = Task.WaitAny(task1, task2); // 回傳完成任務索引
int index = Task.WaitAny(tasks, 3000);  // 含逾時

標準化例外處理:AggregateException

TPL 將多任務例外封裝於 AggregateException,InnerExceptions 屬性保存所有內部例外。

基本捕獲與列舉

try {
    Task.WaitAll(task1, task2, task3);
} catch (AggregateException ex) {
    foreach (var inner in ex.InnerExceptions) {
        Console.WriteLine($"Type: {inner.GetType()}, Source: {inner.Source}");
    }
}

進階:Handle 方法分類處理

ex.Handle(inner => ...) 回傳 true 表示已處理(不再向上拋出),false 保留重拋:

ex.Handle(inner => {
    if (inner is OperationCanceledException) {
        // 處理取消請求
        return true;
    }
    return false; // 未知例外向上傳播
});

此模式可精準控制例外流向,避免吞沒關鍵錯誤。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved