[转]C# CancellationTokenSource 终止线程
我们在多线程中通常使用一个bool IsExit类似的代码来控制是否线程的运行与终止,其实使用CancellationTokenSource来进行控制更为好用,下面我们将介绍CancellationTokenSource相关用法。
C# 使用 CancellationTokenSource 终止线程
使用CancellationTokenSource对象需要与Task对象进行配合使用,Task会对当前运行的状态进行控制(这个不用我们关心是如何孔控制的)。而CancellationTokenSource则是外部对Task的控制,如取消、定时取消。
下面我们来看看示例代码
- class Program
- {
- //声明CancellationTokenSource对象
- static CancellationTokenSource cancelTokenSource = new CancellationTokenSource();
- //程序入口
- static void Main(string[] args)
- {
- Task.Factory.StartNew(MyTask, cancelTokenSource.Token);
- Console.WriteLine("请按回车键(Enter)停止");
- Console.ReadLine();
- cancelTokenSource.Cancel();
- Console.WriteLine("已停止");
- Console.ReadLine();
- }
- //测试方法
- static void MyTask()
- {
- //判断是否取消任务
- while (!cancelTokenSource.IsCancellationRequested)
- {
- Console.WriteLine(DateTime.Now);
- Thread.Sleep(1000);
- }
- }
- }
运行效果如图
Task.Factory.StartNew 创建并启动了 MyTask 方法,并传递了一个 CancellationTokenSource.Token 对象进去。我们可以通过在外部CancellationTokenSource对象进行控制是否取消任务的运行。
当在 MyTask 中的 cancelTokenSource.IsCancellationRequested 判断如果是取消了任务的话 就跳出while循环执行。也就结束了任务
我们还可以使用计时取消任务,当一个任务超过了我们所设定的时间然后自动取消该任务的执行。如下代码所示
- var cancelTokenSource = new CancellationTokenSource(3000);
除了构造函数,我们还可以使用另外一种方式实现定时取消,如下代码所示
- cancelTokenSource.CancelAfter(3000);
运行起来效果是一样的,3秒钟定时取消。
多个 CancellationTokenSource 复合
在有多个CancellationTokenSource需要一起并行管理的时候,比如任意一个任务取消 则取消所有任务。我们不必去一个一个的去关闭,只需要将需要一起并行关闭的CancellationTokenSource组合起来就行了。如下代码所示,执行结果是跟上面的图一样的。我就不再上图了。
- class Program
- {
- //声明CancellationTokenSource对象
- static CancellationTokenSource c1 = new CancellationTokenSource();
- static CancellationTokenSource c2 = new CancellationTokenSource();
- static CancellationTokenSource c3 = new CancellationTokenSource();
- //使用多个CancellationTokenSource进行复合管理
- static CancellationTokenSource compositeCancel = CancellationTokenSource.CreateLinkedTokenSource(c1.Token, c2.Token, c3.Token);
- //程序入口
- static void Main(string[] args)
- {
- Task.Factory.StartNew(MyTask, compositeCancel.Token);
- Console.WriteLine("请按回车键(Enter)停止");
- Console.ReadLine();
- //任意一个 CancellationTokenSource 取消任务,那么所有任务都会被取消。
- c1.Cancel();
- Console.WriteLine("已停止");
- Console.ReadLine();
- }
- //测试方法
- static void MyTask()
- {
- //判断是否取消任务
- while (!compositeCancel.IsCancellationRequested)
- {
- Console.WriteLine(DateTime.Now);
- Thread.Sleep(1000);
- }
- }
- }
以上代码调用了c1.Cancel();触发了MyTask()方法中的compositeCancel.IsCancellationRequested为true,则取消了任务。所以我们在所有任务中判断复合的这个CancellationTokenSource对象即可。
来源:http://www.wxzzz.com/689.html
[转]C# CancellationTokenSource 终止线程的更多相关文章
- C# 使用 CancellationTokenSource 终止线程
http://blog.csdn.net/hezheqiang/article/details/51966511 我们在多线程中通常使用一个 C# 使用 CancellationTokenSource ...
- C# CancellationTokenSource 终止线程 CancellationTokenSource实现对超时任务的取消
C# 使用 CancellationTokenSource 终止线程 使用CancellationTokenSource对象需要与Task对象进行配合使用,Task会对当前运行的状态进行控制(这个不用 ...
- 多个 CancellationTokenSource 复合(组合) 或 C# 使用 CancellationTokenSource 终止线程
https://www.cnblogs.com/luohengstudy/p/5623451.html https://www.cnblogs.com/wlzhang/p/4604471.html
- Java终止线程
Thread提供了stop()方法终止线程,但是该方法是强行终止,容易产生一些错误,已经被废弃. 可以使用退出标志来终止线程,在run()函数里面设置while循环,把退出标志作为while的条件,当 ...
- C# 在异步中使用HttpWebRequest出现的“正在终止线程”错误的解决方案
最近做接口对接,因需求变化需要用到异步推送信息,就利用委托做了异步. 程序运行过程中时不时出现“正在终止线程”的错误信息,导致两边订单信息不一致,代码如下: byte[] byteData = Enc ...
- Android终止线程的方法
线程对象属于一次性消耗品,一般线程执行完run方法之后,线程就正常结束了,线程结束之后就报废了,不能再次start,只能新建一个线程对象.但有时run方法是永远不会结束的.例如在程序中使用线程进行So ...
- java线程中断和终止线程运行
ava中启动一个线程很容易,通常情况下我们都是等到任务运行结束后让线程自行停止.但有时需要在任务正在运行时取消他们,使得线程快速结束.对此Java并没有提供任何机制.但是我们可以通过Java提供的线程 ...
- 1. Server.Transfer跳转页面抛出异常:正在终止线程
今天在向数据库插入数据,之后使用Server.Transfer跳回本页面时,抛出异常:正在终止线程 ry { == String.Compare(Password.Text.Trim(), Confi ...
- Java线程池ThreadPoolExecutor使用和分析(三) - 终止线程池原理
相关文章目录: Java线程池ThreadPoolExecutor使用和分析(一) Java线程池ThreadPoolExecutor使用和分析(二) - execute()原理 Java线程池Thr ...
随机推荐
- Python 的 zip 和 dict 组合 生成新字典
>>> d = dict(zip(['a', 'b'], [1, 2]))>>> d{'a': 1, 'b': 2}>>> d = dict(zi ...
- Kettle5.4.0 java.lang.OutOfMemoryError
CPU: Intel i3 3.40GHz Memory : 8G Kettle默认配置 将MySQL上的一张29W条数据的表,通过Kettle增量抽取到Vertica数据库中,结果在排序这一步报内存 ...
- C#基础提升系列——C#委托
C# 委托 委托是类型安全的类,它定义了返回类型和参数的类型,委托类可以包含一个或多个方法的引用.可以使用lambda表达式实现参数是委托类型的方法. 委托 当需要把一个方法作为参数传递给另一个方法时 ...
- vagrant(二)配置文件vagrantfile详解 以及安装php、nginx、mysql
上一篇文章完整的讲叙了如何安装一个vagrant的环境.这里主要说一说vagrant的配置文件Vagrantfile. 一 配置详解 在我们的开发目录下有一个文件Vagrantfile,里面包含有大量 ...
- MYSQL5.7.9改密码相关设置
Centos7上,对MySQL5.7开启远程连接. 1.修改/etc/my.cnf [mysqld] validate_password=off 2.命令行进入mysql use mysql; GRA ...
- js俩习题
需求,现在要求两个按钮,点击1,背景为红色,点击2,背景为黄色 *****html代码——————————————————————————————————————————————————<!DO ...
- 2018-2019-2 《Java程序设计》第11周学习总结
20175319 2018-2019-2 <Java程序设计>第11周学习总结 教材学习内容总结 本周学习<Java程序设计>第十三章java网络编程: - URL类 URL类 ...
- PHP curl get post请求
POST请求: public function postUrl($url, $postData = false, $header = false) { $ch = curl_init($url); c ...
- jquery 自定义类
jQuery自定义类封装: (function ($) { $.DragField = function (arg) { var name = "你好"; //这个是私有变量,外部 ...
- python3 装饰器修复技术@wraps到底是什么?
Python 装饰器中的@wraps的作用: 装饰器的作用: 在不改变原有功能代码的基础上,添加额外的功能,如用户验证等 @wraps(view_func)的作用: 不改变使 ...