亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

如何在C#中使用 CancellationToken 處理異步任務(wù)

 更新時(shí)間:2021年03月17日 08:37:46   作者:SpringLeee  
這篇文章主要介紹了如何在C#中使用 CancellationToken 處理異步任務(wù),幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下

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

手動(dòng)取消任務(wù)

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

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);

  // 手動(dòng)取消任務(wù)
  cts.Cancel(); 

  Console.ReadKey();
}  

定時(shí)取消任務(wù)

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

 CancellationTokenSource cts = new CancellationTokenSource(1000); 

_ = Execute(cts.Token); 

Console.ReadKey();

我們也可以調(diào)用 cts.CancelAfter(1000), 它會(huì)在1s后取消任務(wù)。

cts.CancelAfter(1000);

CancellationToken 注冊回調(diào)

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

 CancellationTokenSource cts = new CancellationTokenSource(1000);

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

// 開始異步任務(wù)
_ = Execute(cts.Token);  

Console.ReadKey();

Register() 注冊回調(diào)后,返回一個(gè) CancellationTokenRegistration 對象,同樣的,你可以在回調(diào)函數(shù)執(zhí)行前,移除注冊回調(diào),就像這樣:

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

在 HttpClient 中使用

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

 CancellationTokenSource cts = new CancellationTokenSource(10); 

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

Console.ReadKey();

在 WebAPI中使用

我創(chuàng)建了一個(gè) WebAPI 項(xiàng)目,其中的控制器代碼如下,等待了5s,然后進(jìn)行輸出信息。

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

啟動(dòng)項(xiàng)目后,我們在瀏覽器頁面上訪問接口,在第一次訪問接口等待響應(yīng)時(shí),我刷新一次了頁面,現(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í)行后邊的邏輯,當(dāng)然你可以捕獲這個(gè)異常,返回更友好的提示!

以上就是如何在C#中使用 CancellationToken 處理異步任務(wù)的詳細(xì)內(nèi)容,更多關(guān)于C# 用CancellationToken 處理異步任務(wù)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論