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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Unity實現(xiàn)物體弧線運動到規(guī)定的坐標
這篇文章主要為大家詳細介紹了Unity實現(xiàn)物體以弧線的形式運動到規(guī)定的坐標,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-06-06
C#實現(xiàn)Excel與DataTable的數(shù)據(jù)互轉的代碼示例
在.NET框架中,使用C#進行Excel數(shù)據(jù)與DataTable之間的轉換是數(shù)據(jù)分析、報表生成、數(shù)據(jù)遷移等操作中的常見需求,這一過程涉及到將Excel文件中的數(shù)據(jù)讀取并加載至DataTable中,本文將介紹如何通過C#語言實現(xiàn)Excel數(shù)據(jù)與DataTable之間的高效轉換,需要的朋友可以參考下2024-11-11
在C#中調用VBScript、javascript等腳本的實現(xiàn)代碼
在C#中調用VBScript、javascript等腳本的實現(xiàn)步驟,需要的朋友可以參考下。2009-11-11
在C#中使用二叉樹實時計算海量用戶積分排名的實現(xiàn)詳解
這篇文章主要介紹了在C#中使用二叉樹實時計算海量用戶積分排名的實現(xiàn)詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-01-01

