如何在C#中使用 CancellationToken 處理異步任務
在 .NET Core 中使用異步編程已經(jīng)很普遍了, 你在項目中隨處可見 async 和 await,它簡化了異步操作,允許開發(fā)人員,使用同步的方式編寫異步代碼,你會發(fā)現(xiàn)在大部分的異步方法中,都提供了CancellationToken參數(shù),本文主要介紹下 CancellationTokenSource 和 CancellationToken在異步任務中的使用。
手動取消任務
創(chuàng)建一個 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(); }
定時取消任務
創(chuàng)建 CancellationTokenSource 的時候,可以傳入時間(毫秒或者Timespan), 通過它我們可以在等待一段時間后,自動取消任務。
CancellationTokenSource cts = new CancellationTokenSource(1000); _ = Execute(cts.Token); Console.ReadKey();
我們也可以調用 cts.CancelAfter(1000), 它會在1s后取消任務。
cts.CancelAfter(1000);
CancellationToken 注冊回調
我們可以調用 Register()方法,注冊Token取消的回調,參數(shù)需要傳入 Action 委托。
CancellationTokenSource cts = new CancellationTokenSource(1000); cts.Token.Register(() => Console.WriteLine("任務已取消!")); // 開始異步任務 _ = Execute(cts.Token); Console.ReadKey();
Register() 注冊回調后,返回一個 CancellationTokenRegistration 對象,同樣的,你可以在回調函數(shù)執(zhí)行前,移除注冊回調,就像這樣:
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中使用
我創(chuàng)建了一個 WebAPI 項目,其中的控制器代碼如下,等待了5s,然后進行輸出信息。
[HttpGet] public async Task<IActionResult> Index() { await Task.Delay(5000); Console.WriteLine("Executed"); return Ok(); }
啟動項目后,我們在瀏覽器頁面上訪問接口,在第一次訪問接口等待響應時,我刷新一次了頁面,現(xiàn)在程序的輸出信息如下:
說明前臺頁面刷新后,后臺并沒有做取消操作,執(zhí)行了兩次!
我們可以把程序改成這樣,傳入 CancellationToken
[HttpGet] public async Task<IActionResult> Index(CancellationToken token) { await Task.Delay(5000,token); Console.WriteLine("Executed"); return Ok(); }
現(xiàn)在在瀏覽器訪問頁面,同樣的,第一次還未返回是,我們刷新一次頁面,程序輸出如下:
只有一次輸出,第一次請求拋出了一次 TaskCanceledException 異常,沒有繼續(xù)執(zhí)行后邊的邏輯,當然你可以捕獲這個異常,返回更友好的提示!
以上就是如何在C#中使用 CancellationToken 處理異步任務的詳細內容,更多關于C# 用CancellationToken 處理異步任務的資料請關注腳本之家其它相關文章!
相關文章
C#與js實現(xiàn)去除textbox文本框里面重復記錄的方法
這篇文章主要介紹了C#與js實現(xiàn)去除textbox文本框里面重復記錄的方法,很實用的功能,需要的朋友可以參考下2014-08-08C#中將ListView中數(shù)據(jù)導出到Excel的實例方法
首先 你需要添加引用Microsoft Excel 11.0 Object Library2013-04-04