TPL 內建標準化取消模式,核心類別 CancellationTokenSource 與 CancellationToken。
CancellationTokenSourceToken 屬性tokenSource.Cancel()while (true) {
if (token.IsCancellationRequested) {
// 釋放資源
throw new OperationCanceledException(token);
}
// 執行工作單元
}
或簡化為 token.ThrowIfCancellationRequested()。
token.Register(() => Console.WriteLine("取消委托被呼叫"));
// Cancel() 前觸發,可用於通知/記錄
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();
多個 Task 共用同一 Token,Cancel() 一次取消全部。
var composite = CancellationTokenSource.CreateLinkedTokenSource(token1, token2, token3);
// 任一來源 Token 取消 → 組合 Token 取消
Console.WriteLine($"Task1 cancelled: {task1.IsCanceled}");
Console.WriteLine($"Task2 cancelled: {task2.IsCanceled}");