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 ...
随机推荐
- B. Build the Permutation
题目分析:我们先简单的分析一下这道题是在干什么啊,给我们三个整数n,a,b,问我们能否构造这样的排列使得序列中有a个极大值,b个极小值,能的话就给出任意一种可能的情况,不能的话就输出-1: 其实一开始 ...
- iperf/LANSpeedTest网络传输速度测试工具
最近公司测试限速,搜集软件发现两款,iperf,LANSpeedTest. iperf,多平台. LANSpeedTest,读写显示,操作简单. 局域网测试传输,优先考虑UDP. iperf Iper ...
- JavaScript学习总结9
今天学习了表单提交,JQuery部分知识
- Codeforces Round #704 (Div. 2), problem: (C) Maximum width还是要多学习
Problem - C - Codeforces 看清题目要求, 最重要部分在第二段. 大佬最后给出的代码果然简单, 思路简单化, 未必非要把答案在一个大括号里全部完成, 两个指针同时跑,中间加了一堆 ...
- Android第七周作业
1.三个界面,界面1点击按钮使用显式意图开启界面2.界面2点击按钮隐式意图开启界面3 package com.example.myapplication; import androidx.appcom ...
- Rust如何开发eBPF应用(一)?
前言 eBPF是一项革命性的技术,可以在Linux内核中运行沙盒程序,而无需重新编译内核或加载内核模块.它能够在许多内核 hook 点安全地执行字节码,主要应用在云原生网络.安全.跟踪监控等方面. e ...
- JS_进阶-遍历对象属性、数组输出、Math、正则表达式匹配
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...
- Python连接数据库,列表输出数据库中的某一列
1 import pymysql 2 import pandas as pd 3 import numpy as np 4 #连接数据库,地址,端口,用户名,密码,数据库名称,数据格式 5 conn ...
- JavaWeb和WebGIS学习笔记(五)——使用OpenLayers显示地图
系列链接: Java web与web gis学习笔记(一)--Tomcat环境搭建 Java web与web gis学习笔记(二)--百度地图API调用 JavaWeb和WebGIS学习笔记(三)-- ...
- .NET混合开发解决方案6 检测是否已安装合适的WebView2运行时
系列目录 [已更新最新开发文章,点击查看详细] 长青版WebView2运行时将作为Windows 11操作系统的一部分包含在内.但是在Windows 11之前(Win10.Win8.1.Win ...