" />

最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C# CancellationToken的使用小結

 更新時間:2025年11月10日 09:55:08   作者:siyun.chen  
在C#中CancellationToken是用于實現(xiàn)協(xié)作式取消的核心類型,本文就來詳細的介紹一下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ā)兩種異常:

  • OperationCanceledException
  • TaskCanceledException(繼承自前者)

示例

try
{
    await SomeAsyncMethod(token);
}
catch (OperationCanceledException)
{
    Console.WriteLine("操作已被取消。");
}

6. 最佳實踐

  1. 及時傳遞 Token:將 CancellationToken 傳遞給所有需要支持取消的方法。
  2. 避免阻塞操作:在非異步代碼中定期檢查 IsCancellationRequested。
  3. 正確處理異常:不濫用 try-catch 忽略取消異常。
  4. 釋放資源:確保在取消后清理打開的資源(如文件句柄、網(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ī)定的坐標

    這篇文章主要為大家詳細介紹了Unity實現(xiàn)物體以弧線的形式運動到規(guī)定的坐標,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • C#實現(xiàn)文字轉語音功能

    C#實現(xiàn)文字轉語音功能

    這篇文章主要為大家詳細介紹了C#實現(xiàn)文字轉語音功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C#實現(xiàn)Excel與DataTable的數(shù)據(jù)互轉的代碼示例

    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
  • 3種方法實現(xiàn)WindowsForm切換窗口

    3種方法實現(xiàn)WindowsForm切換窗口

    這篇文章主要介紹了3種方法實現(xiàn)WindowsForm切換窗口,文中講解非常詳細,示例代碼幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-07-07
  • C#調用系統(tǒng)API指定快捷鍵的方法

    C#調用系統(tǒng)API指定快捷鍵的方法

    這篇文章主要介紹了C#調用系統(tǒng)API指定快捷鍵的方法,涉及C#快捷鍵的操作技巧,需要的朋友可以參考下
    2015-06-06
  • 在C#中調用VBScript、javascript等腳本的實現(xiàn)代碼

    在C#中調用VBScript、javascript等腳本的實現(xiàn)代碼

    在C#中調用VBScript、javascript等腳本的實現(xiàn)步驟,需要的朋友可以參考下。
    2009-11-11
  • 在C#中使用二叉樹實時計算海量用戶積分排名的實現(xiàn)詳解

    在C#中使用二叉樹實時計算海量用戶積分排名的實現(xiàn)詳解

    這篇文章主要介紹了在C#中使用二叉樹實時計算海量用戶積分排名的實現(xiàn)詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-01-01
  • asp.net新聞列表生成靜態(tài)頁之批量和單頁生成

    asp.net新聞列表生成靜態(tài)頁之批量和單頁生成

    web程序的高訪問量、大數(shù)據(jù)量、高效的用戶體驗度,使靜態(tài)頁技術在越來越多的網(wǎng)站上發(fā)揮作用。這篇文章主要介紹asp.net新聞列表生成靜態(tài)頁之批量和單頁生成,有需要的朋友可以參考下
    2015-08-08
  • C#使用Selenium的實現(xiàn)代碼

    C#使用Selenium的實現(xiàn)代碼

    這篇文章主要介紹了C#使用Selenium的實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-03-03
  • C# 泛型字典 Dictionary的使用詳解

    C# 泛型字典 Dictionary的使用詳解

    本文主要介紹了C# 泛型字典 Dictionary的使用詳解,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05

最新評論

任丘市| 调兵山市| 莒南县| 旬邑县| 石林| 宁河县| 昭通市| 浦县| 泗水县| 濮阳县| 偏关县| 黔东| 万盛区| 紫金县| 黑水县| 白城市| 米林县| 绥芬河市| 台安县| 苏尼特左旗| 东平县| 黎平县| 沙河市| 盐池县| 阳泉市| 桦南县| 阜康市| 镇巴县| 平果县| 长丰县| 资溪县| 东莞市| 含山县| 永清县| 工布江达县| 贵南县| 晋城| 永州市| 东港市| 营山县| 老河口市|