首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# Task.Run(Action, CancellationToken) 取消權杖傳遞機制深度解析

     編輯:程式設計綜合問答

核心問題

CancellationToken 並非自動注入 Action 參數,而是由任務基礎設施監控。Action 內部必須主動檢查或傳遞給可取消的 API。

兩種標準用法

1. 輪詢檢查(適用於長迴圈/計算密集)

var cts = new CancellationTokenSource();
Task.Run(() => {
    for (int i = 0; i < 10000; i++) {
        cts.Token.ThrowIfCancellationRequested(); // 拋出 OperationCanceledException
        DoWork(i);
    }
}, cts.Token);

// 別處呼叫取消
cts.Cancel();

2. 傳遞給支援取消的非同步 API(推薦)

Task.Run(async () => {
    await httpClient.GetAsync(url, cts.Token); // HttpClient 內部監控 token
    await Task.Delay(5000, cts.Token);         // Delay 可直接取消
}, cts.Token);

原理圖解

  • Task.Run 將 CancellationToken 註冊到任務的 CancellationTokenRegistration。
  • 呼叫 cts.Cancel() → Token 進入「已取消」狀態。
  • 任務基礎設施不會強制終止執行緒,僅透過拋出異常或回調通知使用者程式碼。
  • 使用者程式碼必須配合(檢查/傳遞/捕獲異常)才能真正停下。

參考資源

詳細原理請參閱:任務取消機制深度剖析

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