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)的更多相关文章

  1. C#并行编程-PLINQ:声明式数据并行

    目录 C#并行编程-相关概念 C#并行编程-Parallel C#并行编程-Task C#并行编程-并发集合 C#并行编程-线程同步原语 C#并行编程-PLINQ:声明式数据并行 背景 通过LINQ可 ...

  2. .NET Framework4.0 下的多线程

    一.简介 在4.0之前,多线程只能用Thread或者ThreadPool,而4.0下提供了功能强大的Task处理方式,这样免去了程序员自己维护线程池,而且可以申请取消线程等...所以本文主要描述Tas ...

  3. Python并发编程之学习异步IO框架:asyncio 中篇(十)

    大家好,并发编程 进入第十章.好了,今天的内容其实还挺多的,我准备了三天,到今天才整理完毕.希望大家看完,有所收获的,能给小明一个赞.这就是对小明最大的鼓励了.为了更好地衔接这一节,我们先来回顾一下上 ...

  4. 一份详细的asyncio入门教程

    asyncio模块提供了使用协程构建并发应用的工具.它使用一种单线程单进程的的方式实现并发,应用的各个部分彼此合作, 可以显示的切换任务,一般会在程序阻塞I/O操作的时候发生上下文切换如等待读写文件, ...

  5. OKDownload 下载框架 断点续传 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  6. .NET 并行编程——任务并行

    本文内容 并行编程 任务并行 隐式创建和运行任务 显式创建和运行任务 任务 ID 任务创建选项 创建任务延续 创建分离的子任务 创建子任务 等待任务完成 组合任务 任务中的异常处理 取消任务 Task ...

  7. C#并行编程-PLINQ:声明式数据并行-转载

    C#并行编程-PLINQ:声明式数据并行   目录 C#并行编程-相关概念 C#并行编程-Parallel C#并行编程-Task C#并行编程-并发集合 C#并行编程-线程同步原语 C#并行编程-P ...

  8. java并发编程(1)并发程序的取消于关闭

    一.任务的取消于关闭 1.中断Thread 1.每个线程都有一个boolean类型的中断状态.true则是中断状态中 interrupt:发出中断请求:isInterrupt:返回中断状态:inter ...

  9. Swift面试题

    class 和 struct 的区别 1.struct是值类型,class是引用类型. 值类型的变量直接包含它们的数据,对于值类型都有它们自己的数据副本,因此对一个变量操作不可能影响另一个变量. 引用 ...

  10. 异步IO框架:asyncio 中篇

    上一节我们首先介绍了,如何创建一个协程对象.主要有两种方法 通过async关键字, 通过@asyncio.coroutine 装饰函数. 然后有了协程对象,就需要一个事件循环容器来运行我们的协程.其主 ...

随机推荐

  1. uni-app 手指左右滑动实现翻页效果

    首先给页面添加 touch 事件 <view class="text-area" @touchstart="start" @touchend=" ...

  2. v-model语法糖在组件中的使用

    原文地址 v-model 主要是用于表单上数据的双向绑定 一:基本 1:主要用于 input,select,textarea,component 2:修饰符: .lazy- 取代input监听chan ...

  3. LOGIT REGRESSION

    Version info: Code for this page was tested in SPSS 20. Logistic regression, also called a logit mod ...

  4. 【图像处理】DVR H.264视频编码基本知识

    视频编码技术基本是由ISO/IEC制定的MPEG-x和ITU-T制定的H.26x两大系列视频编码国际标准的推出.从H.261视频编码建议,到 H.262/3.MPEG-1/2/4等都有一个共同的不断追 ...

  5. Guava源码阅读-base-Strings

    package com.google.common.base; 今天阅读的是Srings类,这在程序中经常使用. 比如判断字符串是否为空,我们在之前用jdk方法判断是会用下面这个判断语句. if( i ...

  6. 2019牛客暑期多校训练营(第六场)-D Move

    题目链接:https://ac.nowcoder.com/acm/contest/886/D 题意:给n个物品,每个物品有一个体积值,K个箱子,问箱子的最小体积为多少可将物品全部装下. 思路:比赛时一 ...

  7. selenium开发-C#/java/Python

    背景:之前由于自己有编写CefSharp.WinForms 窗体版以及 接口化 WCF+CefSharp.WinForms的网站版本,但是由于某些原因,延伸出Selenium学习与研究 总结:sele ...

  8. JDK1.8 新特性(全)

    原文链接:https://blog.csdn.net/qq_29411737/article/details/80835658

  9. springboot整合httpClient

    创建httpClientConfig配置类 @Configuration @PropertySource(value="classpath:/properties/httpClient.pr ...

  10. PAT B1026.程序运行时间

    AC代码 #include <cstdio> #define CLK_TCK 100 int main() { int C1, C2, C3; scanf("%d%d" ...