取消任务(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 装饰函数. 然后有了协程对象,就需要一个事件循环容器来运行我们的协程.其主 ...
随机推荐
- Markdown 入门基础
MarkDown基础语法 标题 通过 # 来实现标题效果.在markdown当中,标题与html相似,一共有六级标题. # 一级标题 ## 二级标题 ### 三级标题 #### 四级标题 ##### ...
- 0-linux简介
linux是什么? linux有什么用? linux学了能做什么? 潜台词:linux能找什么工作?有没有钱和前途? linux要学什么? 服务的安装,配置,维护 保障服务/系统/业务的稳定,能长期不 ...
- 上传本地文件到SVN
前言:今天按照自己的记忆上传本地文件夹到SVN,出现了点问题,重温了简单操作. https://blog.csdn.net/qq_35150366/article/details/81129847 参 ...
- MySQL: 1006 - Can't create database '***' (errno: 13) 错误 解决方法
原文连接:https://blog.csdn.net/kexiaoling/article/details/50259569 如果使用root账号登录到数据库create database时提错错误: ...
- 【Python】【demo实验25】【练习实例】
原题: 有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和. 我的源码: #!/usr/bin/python # encoding=utf-8 # -* ...
- ASP.NET Core中使用Dapper
⒈添加 NuGet 包 Install-Package Dapper ⒉封装数据库类型 using System; using System.Collections.Generic; using Sy ...
- Keepalive+双主
一.建立3台服务器之间ssh互信在mydb1,mydb2,mydb3服务器上分别执行:ssh-keygen -t rsassh-copy-id -i .ssh/id_rsa.pub root@192. ...
- ubuntu下npm全局安装包报错的解决方案
大概就是 npm WARN registry Unexpected warning for https://registry.npmjs.org/: Miscellaneous Warning ERR ...
- .Net面试题四
1.C#编译成的dll存放在哪个目录?C#程序文件的后缀名是什么?.csproj后缀名是什么文件? 2.请写出C#中常用文件操作类.数据库操作类.网络请求类.每项至少写出三个 3.请定义一个只读属性: ...
- java——ArrayList中contains()方法中的疑问
问题引子: ist<Student> students=new ArrayList<Student>(); students.add(new Student("201 ...