C#取消正在运行的Task
更新记录
本文迁移自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的更多相关文章
- Parallel Programming-使用CancellationTokenSource调度并行运行的Task
本文主要介绍使用CancellationTokenSource调度并行运行的Task. 一.使用场景 有多个Task并行运行时,如果其中一个Task所运行的程序出现异常,我们想马上终止所有待执行的Ta ...
- Mesos源码分析(14): DockerContainerier运行一个Task
DockerContainerizer的实现在文件src/slave/containerizer/docker.cpp中 Future<bool> DockerContainerize ...
- Mesos源码分析(13): MesosContainerier运行一个Task
MesosContainerizer的实现在文件src/slave/containerizer/mesos/containerizer.cpp中 Future<bool> MesosC ...
- Mesos源码分析(10): MesosSchedulerDriver的启动及运行一个Task
MesosSchedulerDriver的代码在src/sched/sched.cpp里面实现. Driver->run()调用start() 首先检测Mesos-Maste ...
- 线程异步操作,更新其中一个报错不影响另一个的运行(Task )
//子系统同步更新 BD001_BLL bll = new BD001_BLL(); List<BD001_Model> lis ...
- .NET 4 并行(多核)编程系列之三 从Task的取消
原文:.NET 4 并行(多核)编程系列之三 从Task的取消 .NET 4 并行(多核)编程系列之三 从Task的取消 前言:因为Task是.NET 4并行编程最为核心的一个类,也我们在是在并行编程 ...
- .NET 4并行编程入门之Task的取消[转]
原文:http://www.cnblogs.com/Leo_wl/archive/2010/06/01/1749596.html前言:因为Task是.NET 4并行编程最为核心的一个类,也我们在是在并 ...
- Task的取消
原文:.NET 4 并行(多核)编程系列之三 从Task的取消 .NET 4 并行(多核)编程系列之三 从Task的取消 前言:因为Task是.NET 4并行编程最为核心的一个类,也我们在是在并行编程 ...
- Task:取消异步计算限制操作 & 捕获任务中的异常
Why:ThreadPool没有内建机制标记当前线程在什么时候完成,也没有机制在操作完成时获得返回值,因而推出了Task,更精确的管理异步线程. How:通过构造方法的参数TaskCreationOp ...
随机推荐
- C# 将PDF转为Excel
通常,PDF格式的文档能支持的编辑功能不如office文档多,针对PDF文档里面有表格数据的,如果想要编辑表格里面的数据,可以将该PDF文档转为Excel格式,然后编辑.本文,将以C#代码为例,介绍如 ...
- linux find命令 -mtime参数 根据修改时间查找文件
命令:find 搜索路径 -mtime n 主要说明n的含义: 例: n=5 "5"指的是前 5~6 天那一天修改的文件 n=-5 "-5"指的是 5 天内修改 ...
- Protoc安装
系统:linux 记住,千万别混乱版本,一般protoc可执行文件在/usr/local/bin/或/usr/bin/下 个人这里使用3.13版本示例,下面两部分命令可以写入shell脚本,记住执行要 ...
- CuteBot智能小车
原因 近期,别人送了我一个CuteBot智能小车,拆开一看做工挺精致的,但是这东西是积木图形编程,显然不适合我这个年龄,所以打算给家里的小孩玩. 那么,你可能会问了,为什么要写这篇文章呢?答案当然是用 ...
- 学习打卡——Mybatis—Plus
今天看完了Mybatis-Plus的视频,在某些方面来看MP确实简化了很多操作,比如自动生成代码等等.学习过程的代码实例也到同步到了gitee和github
- 背包问题dp的初步总结
背包问题 01背包 给定的物体只有0个和1个,只有选与不选的划分,其状态转移方程时由i-1行推出,所以第二层循环是由j=m,递减到v[i]的. for(int i=1;i<=n;i++){ fo ...
- DOM 对象的重点核心
概述 : 文档对象模型(Document Object Model,简称DOM ),是W3C组织推荐的处理可扩展标记语言 (HTML或者XML)的标准编程接口. W3C已经定义了一系列的DOM接口, ...
- 甲骨文严查Java授权,换openJDK要避坑
背景 外媒The Register报道,甲骨文稽查企业用户,近期开始将把过去看管较松散的Java授权加入. 甲骨文针对标准版Java(Java SE)有2种商业授权.2019年4月甲骨文宣布Java ...
- Jquery_HTML-对HTML内容删除添加、操作CSS改变样式、遍历定位元素
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...
- java基础4.19
1.JAVA 的反射机制的原理. JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的信息以及动态调用对象的方 ...