更新记录

本文迁移自Panda666原博客,原发布时间:2021年6月29日。

一、说明

Task默认就依托于底层线程池中的线程,使用.NET为我们定义好的CancellationTokenSource类型就可以实现任务的取消。这是标准规范的任务取消操作。

二、非标准不推荐任务取消操作

除了.NET标准的任务取消操作,我们也可以直接进行对任务底层的线程进行中断,但这是非常不推荐的方式。注意:野蛮的中止线程不是一个好选择!!!

比如:

using System;
using System.Threading;
using System.Threading.Tasks; namespace Panda666comTest
{
class Program
{
static void Main(string[] args)
{
//新建线程引用
Thread thread = null; //新建任务
Task t = Task.Run(() =>
{
//获得当前任务底层的线程的引用
thread = Thread.CurrentThread; //任务开始
Console.WriteLine("Task start!"); //模拟耗时的操作
Thread.Sleep(1000); //任务结束
Console.WriteLine("Task finished!");
}); //让任务先运行起来
Thread.Sleep(10); //强行终止任务
thread.Abort(); //wait
Console.WriteLine("Success");
Console.ReadKey();
}
}
}

注意:线程对象Abort的方法已经在最新的.NET Core中不被支持!!!

三、标准的任务取消操作

具体流程如下:

新建CancellationTokenSource对象用于辅助任务取消

CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();

CancellationTokenSource类型所在命名空间

using System.Treading;

在具体的任务执行中监视CancellationTokenSource对象的成员,Token的IsCancellationRequested属性来确定是否需要取消任务,通过任务定期轮询它,检查是否发出了取消请求

token.IsCancellationRequested

如果调用.Cancel()发出了取消任务请求,任务立即返回,停止继续任务

CancellationTokenSource cansrc = new CancellationTokenSource();
cansrc.Cancel();

那我们来把上面那个野蛮终止Task的例子修改一下

using System;
using System.Threading;
using System.Threading.Tasks; namespace Panda666comTest
{
class Program
{
static void Main(string[] args)
{
CancellationTokenSource tokenSource = new CancellationTokenSource();
CancellationToken cancellationToken = tokenSource.Token; //新建任务
Task t = Task.Run(() =>
{
while(true)
{
//检测任务是否已经被取消
if(tokenSource.IsCancellationRequested)
{
Console.WriteLine("Task canceled");
break;
} //任务开始
Console.WriteLine("Task start!"); //模拟耗时的操作
Thread.Sleep(1000); //任务结束
Console.WriteLine("Task finished!");
}
}, cancellationToken); Thread.Sleep(10); //用户控制是否取消任务
while(true)
{
Console.Write("请切换到英文输入法");
Console.WriteLine("取消任务请按Y");
if((Console.ReadKey()).Key == ConsoleKey.Y)
{
//任务取消
tokenSource.Cancel();
}
}
}
}
}

C#取消正在运行的Task的更多相关文章

  1. Parallel Programming-使用CancellationTokenSource调度并行运行的Task

    本文主要介绍使用CancellationTokenSource调度并行运行的Task. 一.使用场景 有多个Task并行运行时,如果其中一个Task所运行的程序出现异常,我们想马上终止所有待执行的Ta ...

  2. Mesos源码分析(14): DockerContainerier运行一个Task

    DockerContainerizer的实现在文件src/slave/containerizer/docker.cpp中   Future<bool> DockerContainerize ...

  3. Mesos源码分析(13): MesosContainerier运行一个Task

    MesosContainerizer的实现在文件src/slave/containerizer/mesos/containerizer.cpp中   Future<bool> MesosC ...

  4. Mesos源码分析(10): MesosSchedulerDriver的启动及运行一个Task

      MesosSchedulerDriver的代码在src/sched/sched.cpp里面实现.     Driver->run()调用start()     首先检测Mesos-Maste ...

  5. 线程异步操作,更新其中一个报错不影响另一个的运行(Task )

    //子系统同步更新                BD001_BLL bll = new BD001_BLL();                List<BD001_Model> lis ...

  6. .NET 4 并行(多核)编程系列之三 从Task的取消

    原文:.NET 4 并行(多核)编程系列之三 从Task的取消 .NET 4 并行(多核)编程系列之三 从Task的取消 前言:因为Task是.NET 4并行编程最为核心的一个类,也我们在是在并行编程 ...

  7. .NET 4并行编程入门之Task的取消[转]

    原文:http://www.cnblogs.com/Leo_wl/archive/2010/06/01/1749596.html前言:因为Task是.NET 4并行编程最为核心的一个类,也我们在是在并 ...

  8. Task的取消

    原文:.NET 4 并行(多核)编程系列之三 从Task的取消 .NET 4 并行(多核)编程系列之三 从Task的取消 前言:因为Task是.NET 4并行编程最为核心的一个类,也我们在是在并行编程 ...

  9. Task:取消异步计算限制操作 & 捕获任务中的异常

    Why:ThreadPool没有内建机制标记当前线程在什么时候完成,也没有机制在操作完成时获得返回值,因而推出了Task,更精确的管理异步线程. How:通过构造方法的参数TaskCreationOp ...

随机推荐

  1. 关于allegro找不到env文件解决方法

    使用allegro的友人时对于env文件并不陌生.在我们设计的过程中经常使用env文件设置快捷键从而达到快速拉线的目的.但是新安装的allegro软件中会找不到env文件,因为今天自己碰到了这件事,并 ...

  2. c++对c的拓展_函数的引用

    注意:1.引用可作为形参较指针更为直观 2可作为返回值 (判断标准:空间是否释放) #include <iostream> #include <stdlib.h> using ...

  3. spring配置数据源(加载properties文件)

    1.在spring中引入properties配置文件需要引入context的命名空间和真实地址 2.然后加载文件 需要注意的是这是采用的是set注入方式,所以name属性值必须是连接池set方法名去掉 ...

  4. redis集群在线迁移第一篇(数据在线迁移至新集群)实战一

    迁移背景:1.原来redis集群在A机房,需要把其迁移到新机房B上来.2.保证现有环境稳定.3.采用在线迁移方式,因为原有redis集群内有大量数据.4.如果是一个全新的redis集群搭建会简单很多. ...

  5. 3道常见的vue面试题,你都会了吗?

    最近流传各大厂纷纷裁员,导致很多人"被迫"毕业,显然很多人还是想留级,无奈出现在名单中,只能感叹命运不公,不过拿了N+1,也算是很欣慰. 又得去面试了,接下来一起来巩固下vue的3 ...

  6. 【面试普通人VS高手】Kafka的零拷贝原理?

    最近一个学员去滴滴面试,在第二面的时候遇到了这个问题: "请你简单说一下Kafka的零拷贝原理" 然后那个学员努力在大脑里检索了很久,没有回答上来. 那么今天,我们基于这个问题来看 ...

  7. C++篇:第四章_函数_知识点大全

    C++篇为本人学C++时所做笔记(特别是疑难杂点),全是硬货,虽然看着枯燥但会让你收益颇丰,可用作学习C++的一大利器 五.函数 (一)函数使用规则 函数的定义不能嵌套但调用可以嵌套 在函数调用时,如 ...

  8. 安装支付宝小程序的 mini-ali-ui

    1.打开文件的根目录 2.使用npm init -y初始化 3. npm install mini-ali-ui --save 安装 4.在json文件里面定义 例如使用loading加载中的组件 完 ...

  9. 2021.08.03 BZOJ 疯狂的馒头(并查集)

    2021.08.03 BZOJ 疯狂的馒头(并查集) 疯狂的馒头 - 题目 - 黑暗爆炸OJ (darkbzoj.tk) 重点: 1.并查集的神奇运用 2.离线化 题意: 给一个长为n的序列,进行m次 ...

  10. HttpRunner的PB序列化工具类解决方案(python3)

    背景 年初的时候团队内落地了HttpRunner3框架,简单介绍下:HttpRunner 是一款由python开发的面向 HTTP(S) 协议的开源通用测试框架,用例脚本为 YAML/JSON 格式, ...