取消任务(Task)
private static void TaskCancelDemo()
{
//向应该被取消的 System.Threading.CancellationToken 发送信号
CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); //将在线程池上运行的指定工作排队,并返回代表该工作的 Task(TResult) 对象。 借助取消标记,可取消工作。
//以异步方式执行的工作量。应用以取消工作的取消标记。
Task<int> task = Task.Run(() => Sum(cancellationTokenSource.Token, ), cancellationTokenSource.Token); Thread.Sleep();
//Thread.Sleep(1); //传达取消请求
//这是异步请求,Task可能未完成也可能已经完成
cancellationTokenSource.Cancel(); try
{
//若任务已取消,则Result会抛出AggregateException
Console.WriteLine("Sum is " + task.Result);
}
catch (AggregateException aggregateException)
{
//捕获方式一
//如果是OperationCanceledException,则返回true,表示已处理该异常
//如果不是,则返回false,表示该异常未处理,会抛出一个新的AggregateException
//aggregateException.Handle(handle => handle is OperationCanceledException); //捕获方式二
//首先设置永远返回true,表示所有异常已处理,不再新抛出
aggregateException.Handle(handle =>
{
//将任何OperationCanceledException对象都视为已处理(打印输出)
if (handle is OperationCanceledException)
{
Console.WriteLine("Sum was cancelled.");
}
else//如果不是OperationCanceledException,则也已处理(打印输出)
{
Console.WriteLine(aggregateException.Message);
foreach (var e in aggregateException.InnerExceptions)
{
Console.WriteLine(e.Message);
}
} //注:若返回false,则其它(OperationCanceledException除外,因为上面已经处理过)
//任何异常都造成抛出一个新的AggregateException
//若返回true,则已处理异常,不再抛出(即使包含未处理的异常)
return true;
}); //所有异常都处理完成后,执行下面的代码
Console.WriteLine("All exceptions are handled.");
}
} /// <summary>
/// n以内正整数求和
/// </summary>
/// <param name="cancellationToken">取消操作的通知</param>
/// <param name="n"></param>
/// <returns></returns>
private static int Sum(CancellationToken cancellationToken, int n)
{
int sum = ;
for (; n > ; n--)
{
//在取消标识引用的CancellationTokenSource上调用Cancel
//如果已请求取消此标记,则引发 System.OperationCanceledException
cancellationToken.ThrowIfCancellationRequested(); //检查n值,若太大,则抛出OverflowException
checked { sum = sum + n; }
}
return sum;
} 在创建Task时将一个CancellationToken传给构造器(如上例所示),从而将两者关联。但是,虽然Task对象关联了一个CancellationToken,但却没有办法访问它。因此,必须在Task的代码中获得创建Task对象时的同一个CancellationToken。为此,最简单的办法就是使用一个lambda表达式,将CancellationToken作为闭包变量“传递”(如上例所示)。如果CancellationToken在Task调度前取消(会抛出InvalidOperationException),Task会被取消,永远都不执行。但如果Task已调度(通过Start,或者Run,静态Run方法会自动创建Task对象并立即调用Start),那么Task的代码只有显式支持取消,其操作才能在执行期间取消。
取消任务(Task)的更多相关文章
- C#并行编程-PLINQ:声明式数据并行
目录 C#并行编程-相关概念 C#并行编程-Parallel C#并行编程-Task C#并行编程-并发集合 C#并行编程-线程同步原语 C#并行编程-PLINQ:声明式数据并行 背景 通过LINQ可 ...
- .NET Framework4.0 下的多线程
一.简介 在4.0之前,多线程只能用Thread或者ThreadPool,而4.0下提供了功能强大的Task处理方式,这样免去了程序员自己维护线程池,而且可以申请取消线程等...所以本文主要描述Tas ...
- Python并发编程之学习异步IO框架:asyncio 中篇(十)
大家好,并发编程 进入第十章.好了,今天的内容其实还挺多的,我准备了三天,到今天才整理完毕.希望大家看完,有所收获的,能给小明一个赞.这就是对小明最大的鼓励了.为了更好地衔接这一节,我们先来回顾一下上 ...
- 一份详细的asyncio入门教程
asyncio模块提供了使用协程构建并发应用的工具.它使用一种单线程单进程的的方式实现并发,应用的各个部分彼此合作, 可以显示的切换任务,一般会在程序阻塞I/O操作的时候发生上下文切换如等待读写文件, ...
- OKDownload 下载框架 断点续传 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- .NET 并行编程——任务并行
本文内容 并行编程 任务并行 隐式创建和运行任务 显式创建和运行任务 任务 ID 任务创建选项 创建任务延续 创建分离的子任务 创建子任务 等待任务完成 组合任务 任务中的异常处理 取消任务 Task ...
- C#并行编程-PLINQ:声明式数据并行-转载
C#并行编程-PLINQ:声明式数据并行 目录 C#并行编程-相关概念 C#并行编程-Parallel C#并行编程-Task C#并行编程-并发集合 C#并行编程-线程同步原语 C#并行编程-P ...
- java并发编程(1)并发程序的取消于关闭
一.任务的取消于关闭 1.中断Thread 1.每个线程都有一个boolean类型的中断状态.true则是中断状态中 interrupt:发出中断请求:isInterrupt:返回中断状态:inter ...
- Swift面试题
class 和 struct 的区别 1.struct是值类型,class是引用类型. 值类型的变量直接包含它们的数据,对于值类型都有它们自己的数据副本,因此对一个变量操作不可能影响另一个变量. 引用 ...
- 异步IO框架:asyncio 中篇
上一节我们首先介绍了,如何创建一个协程对象.主要有两种方法 通过async关键字, 通过@asyncio.coroutine 装饰函数. 然后有了协程对象,就需要一个事件循环容器来运行我们的协程.其主 ...
随机推荐
- Spark GraphX初探
1. Graphx概念 针对某些领域,如社交网络.语言建模等,graph-parallel系统可以高效地执行复杂的图形算法,比一般的data-parallel系统更快. Graphx是将graph-p ...
- NetCore 对Json文件的读写操作
nuget Microsoft.Extensions.Configuration; Microsoft.Extensions.Configuration.Json; Newtonsoft.Json; ...
- Tensorflow 保存模型 & 在java中调用
本节涉及: 保存TensorFlow 的模型供其他语言使用 java中调用模型并进行预测计算 一.保存TensorFlow 的模型供其他语言使用 如果用户选择“y” ,则执行下面的步骤: 判断程序执行 ...
- 配置cinder-volume服务使用ceph作为后端存储
在ceph监视器上执行 CINDER_PASSWD='cinder1234!'controllerHost='controller'RABBIT_PASSWD='0penstackRMQ' 1.创建p ...
- 【并行计算-CUDA开发】CUDA软件架构与Nvidia硬件对应关系
前面扯了很多,不过大多都是在讲CUDA 在软体层面的东西:接下来,虽然Heresy 自己也不熟,不过还是来研究一下硬体的部分吧-毕竟要最佳化的时候,好像还是要大概知道一下相关的东西的.这部分主要参考资 ...
- SQL -------- JDBC 修改某条记录得内容
package demo; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; ...
- vue-cli3 取消eslint 校验代码 真正的解决办法
在网上找了各种办法都没解决,看了下文档就解决了 关闭vue-cli3.0 报错:eslint-disable-next-line to ignore the next line. 注意我这里是VU ...
- 微信JSAPI支付接口,支付完成后关闭当前窗口
一.把demo里的这一段: success: function (res) { // 支付成功后的回调函数 if (res.err_msg == "get_brand_wcpay_reque ...
- nginx.conf and dockerfile带颜色
wget http://www.vim.org/scripts/download_script.php?src_id=14376 -O nginx.vim mv nginx.vim /usr/shar ...
- wc、iconv命令
一.wc:统计文件打印换行符,单词和字节数 语法: wc [OPTION] ... [FILE] ... wc [OPTION] ... --files0-from = F 描 ...