在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 异常,没有继续执行后边的逻辑,当然你可以捕获这个异常,返回更友好的提示!

欢迎扫码关注我们的公众号 【全球技术精选】,专注国外优秀博客的翻译和开源项目分享。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/303948.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通过Python实现马尔科夫链蒙特卡罗方法的入门级应用

通过把马尔科夫链蒙特卡罗&#xff08;MCMC&#xff09;应用于一个具体问题&#xff0c;本文介绍了 Python 中 MCMC 的入门级应用。GitHub 地址&#xff1a;https://github.com/WillKoehrsen/ai-projects/blob/master/bayesian/bayesian_inference.ipynb过去几月中&#xff0c;…

315曝光不良奸商 对企业不能罚酒三杯

3月15日&#xff0c;315晚会又曝光了一批无良奸商&#xff0c;虽然315晚会年年曝光&#xff0c;各地政府也迅速跟进打击&#xff0c;但侵害消费者权益的情况却屡见不鲜。从被曝光企业的道歉信来看&#xff0c;“承认错误只是个别问题全面排查整改配合管理部门执法向消费者表示道…

.NET 产品版权保护方案 (.NET源码加密保护)

一. 前言大家好&#xff0c;我是康世杰&#xff0c;大家可以叫我Jason。我和大家一样&#xff0c;都是搞技术出身&#xff0c;也未当过讲师&#xff0c;所以口材有限&#xff0c;如果讲得不好之处&#xff0c;还希望大家多多海含&#xff0c;谢谢。今天是我们第一次见面&…

java地图 热力图,腾讯地图数据可视化之热力图

前言数据可视化API(Web)&#xff0c;是基于腾讯位置服务JavaScript API GL实现的专业地理空间数据可视化渲染引擎。 通过这套API&#xff0c;可以实现轨迹数据、坐标点数据、热力、迁徙、航线等空间数据的可视化展现。使用步骤1、注册成为腾讯位置服务开发者&#xff0c;并进入…

建模分析师与算法工程师的主要区别

大家晚上好&#xff0c;我是新来的实习生小模君&#xff0c;前几天小智老师给我科普了数据挖掘的基础知识&#xff0c;颇有收获&#xff0c;于是就趁小天今天有事休假冒个泡跟大家分享一番。数据挖掘&#xff0c;英文名叫Data mining&#xff0c;一般是指从大型数据库中将隐藏的…

Flurl使用Polly实现重试Policy

❝在使用Flurl作为HttpClient向Server请求时&#xff0c;由于网络或者其它一些原因导致请求会有失败的情况&#xff0c;比如HttpStatusCode.NotFound、HttpStatusCode.ServiceUnavailable、HttpStatusCode.RequestTimeout等&#xff1b;网络上有比较多的HttpClientFactory使用P…

推荐15个 JavaScript 和 CSS 库

Tutorialzine的使命是让开发者与最新的Web开发发展同步。因此&#xff0c;我们每月都会精选一批最优秀的资源推荐给大家&#xff0c;相信这些资源你绝对值得拥有&#xff01;ClarifyJSClarifyJS可以让你串联一串方法&#xff0c;以任意顺序执行。通常的JavaScript方法是从左到右…

Dapr Meetup 3.22【周六】

点击蓝字关注我们Dapr&#xff08;Distributed Application Runtime &#xff0c;分布式应用运行时&#xff09;是微软新推出的&#xff0c;一个可移植的、由事件驱动的运行时&#xff0c;用于跨云和边缘构建分布式应用程序。2019年10月9日&#xff0c;正式以 MIT 协议开源。…

日本老爷爷坚持17年用Excel作画,我可能用了假的Excel···

本文来源自网络说起办公软件Excel&#xff0c;不少人可能同小编一样&#xff0c;谈及色变。想想公式、表格头都大了&#xff0c;今天要介绍的这个人竟然可以用其作画&#xff0c;简直是大写的“丧心病狂”&#xff01;这位传奇人物就是堀内辰男&#xff0c;今年已经77岁了&…

腾讯二面挂了,就因为这个...

牛年跳槽季&#xff0c;惨遭开门黑&#xff0c;谨以此文纪念我的首次腾讯面试经历。经我的老师&#xff0c;微软MVP大佬推荐&#xff0c;有幸拿到了腾讯.NET Core高开面试机会&#xff0c;二面却挂在一个最常见的问题上&#xff0c;“你上家公司电商平台的TPS、QPS是多少&#…

51CTO博客 NO.1 大奖赛之后感想---奖品

自从加入51cto技术成就梦想这个大家庭以来&#xff0c;进入这个大家庭可以说是个机会&#xff0c;也可以是个缘分&#xff1b;已经有半年了&#xff0c;明朗炽热般的心&#xff0c;使我深深地喜欢上了这一个大家庭&#xff1b;这个大家庭是一个很不平凡而又富有源源不断学而不尽…

入门 | 我们常听说的置信区间与置信度到底是什么?

机器学习本质上是对条件概率或概率分布的估计&#xff0c;而这样的估计到底有多少是置信度&#xff1f;这里就涉及到统计学里面的置信区间与置信度&#xff0c;本文简要介绍了置信区间这一核心概念&#xff0c;它有助于我们从直观上理解评价估计优劣的度量方法。本文讨论了统计…

.NET 差点不叫“.NET”?微软大牛爆料技术往事

作者 | 伍杏玲出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;2000 年注定是不平凡的一年&#xff1a;千年虫问题爆发、互联网泡沫破灭……正值世界风云突变之际&#xff0c;比尔盖茨和史蒂夫鲍尔默向全球宣布全力打造“下一代因特网”——.NET 平台。比尔盖茨对.N…

【翻译】WPF 中附加行为的介绍 Introduction to Attached Behaviors in WPF

【翻译】WPF 中附加行为的介绍 Introduction to Attached Behaviors in WPF目录 隐藏 引言 [Introduction]背景 [Background]附加行为 [Attached Behaviors]论证 [Demonstration]结论 [Conclusion]参考 [References]版本历史 [Revision History]许可证 [License]作者&#xff…

地图是怎么知道实时路况的?因为我们每个人都是“百万年薪级”数据贡献者

【导读】地图公司给地图“上色”主要靠数据&#xff0c;数据够则地图生。数据是地图的生命&#xff0c;车速是路况的根本&#xff0c;地图获取数据主要有两种方式&#xff1a;自给自足、仰给于人上班出门&#xff0c;点开地图&#xff0c;前面红色&#xff0c;后面红色&#xf…

MySQL优化从执行计划开始(explain超详细)

前言小伙伴一定遇到过这样反馈&#xff1a;这页面加载数据太慢啦&#xff0c;甚至有的超时了&#xff0c;用户体验极差&#xff0c;需要赶紧优化&#xff1b;反馈等同于投诉啊&#xff0c;多有几次&#xff0c;估计领导要找你谈话啦。于是不得不停下手里头的活&#xff0c;赶紧…

一个老程序员的忠告:不要一辈子靠技术生存

图丨《Ready Player One》文丨源&#xff1a;世界经理人我现在是自己做&#xff0c;但我此前有多年在从事软件开发工作&#xff0c;当回过头来想一想自己&#xff0c;觉得特别想对那些初学JAVA/DOT。NET技术的朋友说点心里话&#xff0c;希望你们能从我们的体会中&#xff0c;多…

怎样安装php52-71,CentOS如何安装PHP5和PHP7

推荐(免费)&#xff1a;PHP7安装PHP5下载解压二进制包[roottest-a src]# cd /usr/local/src/[roottest-a src]# wget http://cn2.php.net/distributions/php-5.6.32.tar.bz2[roottest-a src]# tar jxvf php-5.6.32.tar.bz2编译安装PHP./configure --prefix/usr/local/php --wit…

应用程序自动更新组件GeneralUpdate3.2.1发布

GeneralUpdate开源组件更新公告一、组件简介GeneralUpdate是基于.net standard开发的一款&#xff08;c/s应用&#xff09;自动升级程序。该组件将更新的核心部分抽离出来方便应用于多种项目当中目前适用于wpf&#xff0c;控制台应用&#xff0c;winfrom。本组件&#xff08;除…

你不知道C#只带有 get 访问器的属性是只读属性?

问题窥探之前有个哥们在使用Newtonsoft.Json反序列化的时候&#xff0c;发现明明有数据&#xff0c;但是就是序列化不出来数据到实体里面。咋一看&#xff0c;确实没什么问题啊&#xff0c;字符串的数据是存在的。那么问题出在哪里呢。解决思路1、我让他把字符串复制出来&#…