任务Task系列之使用CancellationToken取消Task
本文参考书籍《CLR via C#》
Task的取消采用一种形如令牌(Token)的方式。首先先构建一个CancellationTokenSource实例,然后任务中执行的方法必须能接受一个CancellationToken类型的参数。
假设我们有这样一个方法:

private static Int32 NumValue(CancellationToken token, Int32 n)
{
Int32 sum = 0;
for (int i = 0; i < n; i++)
{
token.ThrowIfCancellationRequested();
checked
{
sum += i;
}
}
return sum;
}

上述代码中的循环中调用CancellationToken的ThrowIfCancellationRequested()方法定时检查操作是否已经取消,这个方法与CancellationToken的IsCancellationRequested属性作用一致,如果CancellationTokenSource已经取消,ThrowIfCancellationRequested()会抛出一个异常表示当前任务已经被取消。
我们创建Task和CancellationTokenSource的对象:

private static void TaskRun()
{
CancellationTokenSource tokenSource = new CancellationTokenSource();
Task<Int32> task = Task.Run(() => NumValue(tokenSource.Token, 1000000), tokenSource.Token); //发出取消的请求
tokenSource.Cancel(); try
{
Console.WriteLine("计算求和为:{0}",task.Result);
}
catch (AggregateException ex)
{
ex.Handle(e => e is OperationCanceledException);
Console.WriteLine("用户已取消");
}
}

可在创建Task时将一个CancellationToken传给构造器,从而将两者相关联,如果CancellationToken在Task调度前取消,那么Task就会被取消,永远都不执行。但如果Task已调度,那么Task的代码就只支持显示取消,其操作才能在执行期间取消,遗憾的是,虽然Task关联了一个CancellationToken,但却没有办法访问他。因此,必须在Task的代码中获得创建Task对象时的同一个CancellationToken。为此,最简单的办法就是使用一个Lamda表达式,将CancellationToken作为闭包变量传递。
任务Task系列之使用CancellationToken取消Task的更多相关文章
- Task记录1.CancellationToken 取消Task任务的操作
//1.创建取消令牌数据 CancellationTokenSource tokenSource = new CancellationTokenSource(); //2.创建取消令牌 Cancell ...
- 创建CancellationTokenSource对象用于取消Task
虽然使用线程池ThreadPool让我们使用多线程变得容易,但是因为是由系统来分配的,如果想对线程做精细的控制就不太容易了,比如某个线程结束后执行一个回调方法.恰好Task可以实现这样的需求.这篇文章 ...
- 任务取消TASK
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- Task记录3 :ContinueWith ,CancellationToken,的结合
static void Main(string[] args) { //1.创建取消令牌数据 CancellationTokenSource tokenSource = new Cancellatio ...
- 聊聊多线程那一些事儿(task)之 三 异步取消和异步方法
hello,咋们又见面啦,通过前面两篇文章的介绍,对task的创建.运行.阻塞.同步.延续操作等都有了很好的认识和使用,结合实际的场景介绍,这样一来在实际的工作中也能够解决很大一部分的关于多线程的业务 ...
- 聊聊多线程哪一些事儿(task)之 三 异步取消和异步方法
hello,咋们又见面啦,通过前面两篇文章的介绍,对task的创建.运行.阻塞.同步.延续操作等都有了很好的认识和使用,结合实际的场景介绍,这样一来在实际的工作中也能够解决很大一部分的关于多线程的业务 ...
- 在ASP.NET Core中用HttpClient(五)——通过CancellationToken取消HTTP请求
用户向服务器发送HTTP请求应用程序页面是一种非常可能的情况.当我们的应用程序处理请求时,用户可以从该页面离开.在这种情况下,我们希望取消HTTP请求,因为响应对该用户不再重要.当然,这只是实际应用 ...
- .NET 中 如果一个Task A正在await另一个Task B,那么Task A是什么状态
新建一个.NET Core控制台程序,输入如下代码: using System; using System.Threading; using System.Threading.Tasks; class ...
- 019_Map Task数目的确定和Reduce Task数目的指定
注意标题:Map Task数目的确定和Reduce Task数目的指定————自然得到结论,前者是后者决定的,后者是人为指定的.查看源码可以很容易看懂 1.MapReduce作业中Map Task数目 ...
- Apparatus, system, and method for automatically minimizing real-time task latency and maximizing non-real time task throughput
An apparatus, system, and method are provided for automatically minimizing Real-Time (RT) task laten ...
随机推荐
- Apollo+ES源码改造,构建民生银行的ELK日志平台配置管理中心【转载】
Apollo+ES源码改造,构建民生银行的ELK日志平台配置管理中心 原创 高效开发运维 架构头条 2019-02-28 作者 | 中国民生银行大数据基础平台运维组团队 编辑 | 张婵 随着 IT 业 ...
- Vue3 解构赋值失去响应式引发的思考
前言 vue3发布以来经历两年风头正盛,现在大有和react 平分秋色的势头,我们知道他是基于proxy 实现响应式的能力, 解决了vue2所遗留下来的一些问题,同时也正由于proxy的特性,也提高了 ...
- 力扣1132(MySQL)-报告的记录Ⅱ(中等)
题目: 编写一段 SQL 来查找:在被报告为垃圾广告的帖子中,被移除的帖子的每日平均占比,四舍五入到小数点后 2 位. Actions 表: Removals 表: Result 表: 2019-07 ...
- NICA 校际交流赛#2 游记
\(1\!:\!15\) 到达考场,检测好网络和电脑. 分配任务,sxshm 打前 \(5\) 题,tcy01_QAQ_ 打 \(6,\!7\) 两题,我打后面的题. \(1\!:\!30\) 显得无 ...
- 搜索NLP行业模型和轻量化客户定制
简介:开放搜索NLP行业模型和轻量化客户定制方案,解决减少客户标注成本.完全无标注或少量简单标注的等问题,让搜索领域扩展更易用. 特邀嘉宾: 徐光伟(昆卡)--阿里巴巴算法专家 搜索NLP算法 搜索 ...
- sysAK(青囊)系统运维工具集:如何实现高效自动化运维?| 龙蜥技术
简介:What is sysAK.典型工具介绍.开源 3 方面介绍了 sysAK 系统,目前 sysAK 工具集已经在龙蜥社区开源,并且在系统运维 SIG.跟踪诊断 SIG 一起共建,希望大家后期加 ...
- [Go] golang 时间格式化 12小时制 与 24小时制
timestamp := int64(1591271169) # 12小时制 time.Unix(timestamp, 0).Format("2006-01-02 03:04:05" ...
- IIncrementalGenerator 增量 Source Generator 生成代码入门 从语法到语义 获取类型完全限定名
本文告诉大家如何在使用 IIncrementalGenerator 进行增量的 Source Generator 生成代码时,如何从语法分析过程,将获取的语法 Token 转换到语义分析上,比如获取类 ...
- VisualStudio 调试时会不断刷新 WPF 应用渲染
在 VisualStudio 附加调试和没有用 VisualStudio 附加调试时,对应用程序是有不同的影响,如 VisualStudio 设计器将会在附加调试 WPF 应用的时候,不断刷新 WPF ...
- petalinux 报错总结
Failed to menu config project component.... 解决办法 此处是由于Terminal(终端)的界面太窄导致的,把Terminal(终端)界面拉宽即可:重新执行命 ...