在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,一经查实,立即删除!

相关文章

RHEL 5.4下cyrus-sasl-2.1.22 的编译安装

我们直接从编译前的配置开始&#xff1a; 1)编译前的配置 #./configure --disable-anon --enable-login --enable-ntlm --with-saslauthd/var/run/saslauthd 2&#xff09;编译并安装 #make ; make install 3&#xff09;建立库文件的链接文件 #ln -s /usr/loca…

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

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

Java如何控制用户输入的长度,用Java Applet 进行Web编程时,如何限制输入域中可输入字符的长度!解决后马上给分!!!...

用Java Applet 进行Web编程时&#xff0c;如何限制输入域中可输入字符的长度&#xff01;解决后马上给分&#xff01;&#xff01;&#xff01;|create a new class FixLengthDocument extends PlainDocument, override public void insertString(int offs, String str, Attrib…

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…

Linux下判断cpu物理个数、几核

自己服务器的输出 1. 查看物理CPU的个数 #cat /proc/cpuinfo |grep "physical id"|sort |uniq|wc -l12. 查看逻辑CPU的个数#cat /proc/cpuinfo |grep "processor"|wc -l83. 查看CPU是几核#cat /proc/cpuinfo |grep "cores"|uniqcpu cores : 44.…

java并发框架支持锁包括,jdk1.8锁

JDK1.8有什么锁?_李广进的博客-CSDN博客2020年4月23日 18、排他锁(不包含),X锁,若事务T对数据对象A加上x锁,则只允许T读取和修改A,其他任何事务都不能再对A加任何类型的锁,直到T释放A上的锁。这就保证了其他...jdk1.8对锁进行了哪些优化? - 知乎2020年1月8日 关注问题​写回答…

推荐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 协议开源。…

iPhone Development Blog系列: 如何制作服务条例窗口

iPhone Development Blog系列: 如何制作服务条例窗口 最近一直关注iPhone Development Blog上面的文章&#xff0c;学习的同时尝试通过翻译和整理同大家一起分享&#xff01; 假设你想让你的每个客户在使用iPhone应用前接受你的服务条例&#xff08;Terms of Services&#xff…

用matlab算24点小游戏,24点游戏的Matlab程序

function GUI_games24S.fh figure(units,pixels,...position,[500 500 800 200],...menubar,none,...name,24点游戏,...numbertitle,off,...resize,off);S.ti uicontrol(style,text,...units,pix,...position,[300 150 180 30],...string,24点的计算程序,fontsize,15);S.ra u…

日本老爷爷坚持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;这个大家庭是一个很不平凡而又富有源源不断学而不尽…

php defunct,通过swoole观察僵尸进程和孤儿进程出现和消亡

声明&#xff1a;维基百科上没有僵死进程的词条&#xff0c;这里认为僵死进程同僵尸进程&#xff0c;即ZOMBIE。一、定义什么是僵尸进程维基百科的定义&#xff1a;在类UNIX系统中&#xff0c;僵尸进程是指完成执行(通过exit系统调用&#xff0c;或运行时发生致命错误或收到终止…

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

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

【谷歌】Google Chrome 浏览器中 font-size 12px 没有效果

Google Chrome 浏览器中 font-size < 12px 没有效果 解决方法&#xff1a; *&#xff5b;-webkit-text-size-adjust: none;&#xff5d; 此功能立竿见影&#xff0c;目的是去掉CHROME的自动调整字体大小&#xff0c;显示比12PX小的字体。转载于:https://www.cnblogs.com/cos…