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

.NET 並行程式設計系列(三):Task 取消機制完整指南

     編輯:關於.NET

TPL 內建標準化取消模式,核心類別 CancellationTokenSource 與 CancellationToken。

建立可取消 Task 步驟

  1. 建立 CancellationTokenSource
  2. 取得 Token 屬性
  3. 建構 Task 時傳入 Token(第二參數)
  4. 啟動 Task
  5. 需取消時呼叫 tokenSource.Cancel()

Task 內部檢測取消的三種方式

1. 輪詢 IsCancellationRequested

while (true) {
    if (token.IsCancellationRequested) {
        // 釋放資源
        throw new OperationCanceledException(token);
    }
    // 執行工作單元
}

或簡化為 token.ThrowIfCancellationRequested()。

2. 註冊取消委托

token.Register(() => Console.WriteLine("取消委托被呼叫"));
// Cancel() 前觸發,可用於通知/記錄

3. 使用 WaitHandle 等待取消訊號

token.WaitHandle.WaitOne(); // 阻塞直到 Cancel()
Console.WriteLine("WaitHandle 釋放");

完整範例:輪詢檢測

var tokenSource = new CancellationTokenSource();
var token = tokenSource.Token;
var task = new Task(() => {
    for (int i = 0; i < int.MaxValue; i++) {
        if (token.IsCancellationRequested) {
            Console.WriteLine("偵測到取消");
            throw new OperationCanceledException(token);
        }
        Console.WriteLine(i);
    }
}, token);
Console.ReadLine(); // 按 Enter 啟動
task.Start();
Console.ReadLine(); // 按 Enter 取消
tokenSource.Cancel();

進階主題

單一 Token 取消多個 Task

多個 Task 共用同一 Token,Cancel() 一次取消全部。

組合 Token

var composite = CancellationTokenSource.CreateLinkedTokenSource(token1, token2, token3);
// 任一來源 Token 取消 → 組合 Token 取消

判斷 Task 是否已取消

Console.WriteLine($"Task1 cancelled: {task1.IsCanceled}");
Console.WriteLine($"Task2 cancelled: {task2.IsCanceled}");
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved