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

.NET 並行程式設計系列(六):Task 基礎完結篇——狀態查詢、延遲啟動與常見陷阱

     編輯:關於.NET

結束 Task 基礎系列,補充三項實用主題:任務狀態查詢、延遲初始化啟動、死鎖與例外處理常見陷阱。

1. 任務狀態查詢:Task.Status

回傳 TaskStatus 列舉值:

  • Created:已初始化,未進入排程器
  • WaitingForActivation:等待排程器啟動
  • WaitingToRun:已排程,等待執行
  • Running:正在執行
  • WaitingForChildrenToComplete:父任務等待子任務完成
  • RanToCompletion:正常完成
  • Canceled:已取消
  • Faulted:執行期間拋出例外

2. 延遲啟動任務

結合 Lazy<T> 與 TaskFactory.StartNew,僅在首次存取 Value 時建立並啟動 Task,減少非必要開銷:

Func<string> body = () => { Console.WriteLine("Working..."); return "Result"; };
Lazy<Task<string>> lazyTask = new Lazy<Task<string>>(() => Task<string>.Factory.StartNew(body));
Console.WriteLine("Before access");
Console.WriteLine($"Result: {lazyTask.Value.Result}"); // 此處才真正建立並啟動 Task

優勢:Lazy<T> 初始化成本遠低於 Task,適合條件性使用的長時間任務。

3. 常見陷阱與解決方案

Task 死鎖

多個 Task 互相等待對方結果形成循環依賴:

Task<int>[] tasks = new Task<int>[2];
tasks[0] = Task.Factory.StartNew(() => tasks[1].Result + 100);
tasks[1] = Task.Factory.StartNew(() => tasks[0].Result + 100); // 互相等待 → 死鎖
Task.WaitAll(tasks); // 永久阻塞

解決:避免 Task 執行體內直接依賴其他 Task 結果,改用續發任務或資料流程設計。

例外處理最佳實踐

參考系列第五篇:使用 Task.WaitAll 捕獲 AggregateException,透過 Handle 方法分類處理已知/未知例外。

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