C# CancellationToken的使用小結
在 C# 中,CancellationToken 是用于實現(xiàn) 協(xié)作式取消(Cooperative Cancellation) 的核心類型,主要應用于異步操作、多線程任務或長時間運行的任務。以下是詳細的講解:
1. 核心概念
- 作用:允許一個任務/操作在外部被請求取消,任務自身會定期檢查是否被取消請求,實現(xiàn)優(yōu)雅終止。
- 協(xié)作式:任務需要主動配合檢查取消請求(不能強行終止線程)。
- 組成:
CancellationTokenSource:生成和管理CancellationToken的類。CancellationToken:傳遞給任務的結構體,用于傳遞“取消信號”。
2. 基本用法
步驟 1:創(chuàng)建 CancellationTokenSource 和 Token
var cts = new CancellationTokenSource(); CancellationToken token = cts.Token;
步驟 2:將 Token 傳遞給任務
Task.Run(() =>
{
// 任務邏輯
}, token);
步驟 3:觸發(fā)取消
cts.Cancel(); // 請求取消所有關聯(lián) Token 的任務
3. 在任務中處理取消
輪詢檢查 Token
public void LongRunningOperation(CancellationToken token)
{
while (!token.IsCancellationRequested)
{
// 持續(xù)工作...
Thread.Sleep(1000);
}
// 清理資源,優(yōu)雅退出
Console.WriteLine("操作被取消。");
}
拋出取消異常
當需要直接終止操作時,可以通過拋出 OperationCanceledException 來快速響應取消請求:
token.ThrowIfCancellationRequested(); // 如果取消已請求,拋出異常
4. 高級特性
注冊取消回調
當取消被觸發(fā)時,執(zhí)行指定的回調函數(shù)(如釋放資源):
token.Register(() =>
{
Console.WriteLine("清理資源,取消已觸發(fā)!");
});
超時自動取消
利用 CancellationTokenSource 設置超時時間,自動觸發(fā)取消:
var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5)); // 5秒后自動取消
組合 Token(鏈接)
將多個 CancellationToken 組合成一個,任一觸發(fā)則全部取消:
var linkedCts = CancellationTokenSource.CreateLinkedTokenSource(token1, token2); var linkedToken = linkedCts.Token;
5. 異常處理
取消操作通常會引發(fā)兩種異常:
OperationCanceledExceptionTaskCanceledException(繼承自前者)
示例:
try
{
await SomeAsyncMethod(token);
}
catch (OperationCanceledException)
{
Console.WriteLine("操作已被取消。");
}
6. 最佳實踐
- 及時傳遞 Token:將
CancellationToken傳遞給所有需要支持取消的方法。 - 避免阻塞操作:在非異步代碼中定期檢查
IsCancellationRequested。 - 正確處理異常:不濫用
try-catch忽略取消異常。 - 釋放資源:確保在取消后清理打開的資源(如文件句柄、網(wǎng)絡連接)。
7. 使用場景
- 用戶取消操作(如界面上的“取消”按鈕)。
- 服務限時處理(例如 API 請求超時)。
- 后臺任務管理(如 ASP.NET Core 中請求中止處理)。
- 并行任務控制(取消一組相關任務)。
8. 完整示例
var cts = new CancellationTokenSource();
var token = cts.Token;
// 啟動任務
var task = Task.Run(() =>
{
try
{
while (true)
{
token.ThrowIfCancellationRequested();
Console.WriteLine("工作...");
Thread.Sleep(1000);
}
}
catch (OperationCanceledException)
{
Console.WriteLine("任務取消。");
}
});
// 例如:用戶按下取消按鈕,或者超時自動取消
Thread.Sleep(3000);
cts.Cancel();
9. 注意事項
- 線程安全:
CancellationToken是一個只讀結構體,本身線程安全。 - 資源釋放:
CancellationTokenSource實現(xiàn)了IDisposable,長時間不使用時需釋放。 - 不可復用:一旦取消,Token 無法重新激活,需創(chuàng)建新的
CancellationTokenSource。
到此這篇關于C# CancellationToken的使用小結的文章就介紹到這了,更多相關C# CancellationToken使用內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C#針對System.Drawing.Bitmap壓縮的實現(xiàn)
C#中System.Drawing.Bitmap壓縮可通過調整尺寸和JPEG質量實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2025-07-07
基于C#的UDP協(xié)議的同步通信實現(xiàn)代碼
本篇文章主要介紹了基于C#的UDP協(xié)議的同步實現(xiàn)代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02
C#如何將List<string>轉換為List<double>
這篇文章主要介紹了C#如何將List<string>轉換為List<double>問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07

