日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

在C#中使用 CancellationToken 处理异步任务

發布時間:2023/12/4 C# 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在C#中使用 CancellationToken 处理异步任务 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在 .NET Core 中使用異步編程已經很普遍了, 你在項目中隨處可見 async 和 await,它簡化了異步操作,允許開發人員,使用同步的方式編寫異步代碼,你會發現在大部分的異步方法中,都提供了CancellationToken參數,本文主要介紹下 CancellationTokenSource 和 CancellationToken在異步任務中的使用。

手動取消任務

創建一個 CancellationTokenSource,然后調用異步方法時,傳入 CancellationToken,它是一個輕量級對象,可以通知請求是否已取消,我們可以手動調用 cts.Cancel() 來取消任務,為了方面演示,這里我有用到局部方法。

static async Task Main(string[] args) {async Task Execute(CancellationToken token){await Task.Delay(3000, token);Console.WriteLine("Executed");} CancellationTokenSource cts = new CancellationTokenSource(); _ = Execute(cts.Token);// 手動取消任務cts.Cancel(); Console.ReadKey(); }

定時取消任務

創建 CancellationTokenSource 的時候,可以傳入時間(毫秒或者Timespan), 通過它我們可以在等待一段時間后,自動取消任務。

CancellationTokenSource cts = new CancellationTokenSource(1000); _ = Execute(cts.Token); Console.ReadKey();

我們也可以調用 cts.CancelAfter(1000), 它會在1s后取消任務。

cts.CancelAfter(1000);

CancellationToken 注冊回調

我們可以調用 Register()方法,注冊Token取消的回調,參數需要傳入 Action 委托。

CancellationTokenSource cts = new CancellationTokenSource(1000);cts.Token.Register(() => Console.WriteLine("任務已取消!"));// 開始異步任務 _ = Execute(cts.Token); Console.ReadKey();

Register() 注冊回調后,返回一個 CancellationTokenRegistration 對象,同樣的,你可以在回調函數執行前,移除注冊回調,就像這樣:

cts.Token.Register(() => Console.WriteLine("任務已取消!")).Unregister();

在 HttpClient 中使用

同樣,你可以在 HttpClient 中使用傳入 CancellationToken (或者使用HttpClient的Timeout屬性),超時后,它會拋出一個 TaskCanceledException 的異常:

CancellationTokenSource cts = new CancellationTokenSource(10); _ = await new HttpClient().GetAsync("https://www.youtube.com/",cts.Token); Console.ReadKey();

在 WebAPI中使用

我創建了一個 WebAPI 項目,其中的控制器代碼如下,等待了5s,然后進行輸出信息。

[HttpGet] public async Task<IActionResult> Index() {await Task.Delay(5000);Console.WriteLine("Executed");return Ok(); }

啟動項目后,我們在瀏覽器頁面上訪問接口,在第一次訪問接口等待響應時,我刷新一次了頁面,現在程序的輸出信息如下:

說明前臺頁面刷新后,后臺并沒有做取消操作,執行了兩次!

我們可以把程序改成這樣,傳入 CancellationToken

[HttpGet] public async Task<IActionResult> Index(CancellationToken token) {await Task.Delay(5000,token);Console.WriteLine("Executed");return Ok(); }

現在在瀏覽器訪問頁面,同樣的,第一次還未返回是,我們刷新一次頁面,程序輸出如下:

只有一次輸出,第一次請求拋出了一次 TaskCanceledException 異常,沒有繼續執行后邊的邏輯,當然你可以捕獲這個異常,返回更友好的提示!

歡迎掃碼關注我們的公眾號 【全球技術精選】,專注國外優秀博客的翻譯和開源項目分享。

總結

以上是生活随笔為你收集整理的在C#中使用 CancellationToken 处理异步任务的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。