C# CancellationTokenSource 终止线程 CancellationTokenSource实现对超时任务的取消

C# 使用 CancellationTokenSource 终止线程

使用CancellationTokenSource对象需要与Task对象进行配合使用,Task会对当前运行的状态进行控制(这个不用我们关心是如何孔控制的)。而CancellationTokenSource则是外部对Task的控制,如取消、定时取消。

下面我们来看看示例代码

  1. class Program
  2. {
  3. //声明CancellationTokenSource对象
  4. static CancellationTokenSource cancelTokenSource = new CancellationTokenSource();
  5. //程序入口
  6. static void Main(string[] args)
  7. {
  8. Task.Factory.StartNew(MyTask, cancelTokenSource.Token);
  9. Console.WriteLine("请按回车键(Enter)停止");
  10. Console.ReadLine();
  11. cancelTokenSource.Cancel();//通知取消任务或者终止线程
  12. Console.WriteLine("已停止");
  13. Console.ReadLine();
  14. }
  15. //测试方法
  16. static void MyTask()
  17. {
  18. //判断是否取消任务
  19. while (!cancelTokenSource.IsCancellationRequested)
  20. {
  21. Console.WriteLine(DateTime.Now);
  22. Thread.Sleep(1000);
  23. }
  24. }
  25. }

.Net 4.5中通过CancellationTokenSource实现对超时任务的取消

在基于Task的任务执行过程中,我们通常使用CancellationTokenSource来实现任务取消,首先看一个简单的例子。

();

.Factory.StartNew(() =>
    {
         (!cancelTokenSource.IsCancellationRequested)
        {
            .Now);
            .Sleep(1000);
        }
    }, cancelTokenSource.Token);

);
    .ReadLine();
    cancelTokenSource.Cancel();
    );
    .ReadLine();

很多时候,除了像上例中的那样手动取消外,我们往往也要对任务设置一个预期执行时间,对超时的任务自动取消。之前一般做法是新启动一个计时器,在计时器的超时回调中执行CancellationTokenSource.Cancel方法。在.Net 4.5中,该操作得到了进一步的简化,我们可以通过在创建CancellationTokenSource时设置超时来实现这一功能。

var cancelTokenSource = new CancellationTokenSource(3000);

除此之外,也可以通过如下代码实现同样的效果。

cancelTokenSource.CancelAfter(3000);

时间: 2024-07-29 04:29:59

C# CancellationTokenSource 终止线程 CancellationTokenSource实现对超时任务的取消的相关文章

C# CancellationTokenSource 终止线程

我们在多线程中通常使用一个bool IsExit类似的代码来控制是否线程的运行与终止,其实使用CancellationTokenSource来进行控制更为好用,下面我们将介绍CancellationTokenSource相关用法. C# 使用 CancellationTokenSource 终止线程 使用CancellationTokenSource对象需要与Task对象进行配合使用,Task会对当前运行的状态进行控制(这个不用我们关心是如何孔控制的).而CancellationTokenSou

C# 使用 CancellationTokenSource 终止线程

http://blog.csdn.net/hezheqiang/article/details/51966511 我们在多线程中通常使用一个 C# 使用 CancellationTokenSource 终止线程 使用CancellationTokenSource对象需要与Task对象进行配合使用,Task会对当前运行的状态进行控制(这个不用我们关心是如何孔控制的).而CancellationTokenSource则是外部对Task的控制,如取消.定时取消. 下面我们来看看示例代码 class P

异步与并行~CancellationTokenSource对线程的作用

返回目录 说起CancellationTokenSource我们应该不会陌生,对于Thread,Task来说,我们启动一个线程去做一些事,如果希望它在某个阶段去被动的停止,可以使用这个CancellationTokenSource对象,把它注入到Task里,使用当外界触发Cancel()方法时,你的这个线程就会被取消了,挺好用,感觉应该是在Task内部封装的一种方法回周机制,在外部控制Task的状态! 看大叔的测试代码 CancellationTokenSource cancelTokenSou

Java线程池ThreadPoolExecutor使用和分析(三) - 终止线程池原理

相关文章目录: Java线程池ThreadPoolExecutor使用和分析(一) Java线程池ThreadPoolExecutor使用和分析(二) - execute()原理 Java线程池ThreadPoolExecutor使用和分析(三) - 终止线程池原理 以下是本文的目录大纲: 一.shutdown()  --  温柔的终止线程池 interruptIdleWorkers()  --  中断空闲worker tryTerminate()  --  尝试终止线程池 二.shutdown

Java中如何优雅正确的终止线程

Java中终止线程的方式主要有三种: 1.使用stop()方法,已被弃用.原因是:stop()是立即终止,会导致一些数据被到处理一部分就会被终止,而用户并不知道哪些数据被处理,哪些没有被处理,产生了不完整的"残疾"数据,不符合完整性,所以被废弃.So, forget it! 2.使用volatile标志位 看一个简单的例子: 首先,实现一个Runnable接口,在其中定义volatile标志位,在run()方法中使用标志位控制程序运行 public class MyRunnable i

终止线程的方法

1.用标识符flag来停止. public void run() { // TODO Auto-generated method stub while (flag) { System.out .println(name + ":" + (++num)); if(num==10000) changeFlag(); //Thread.currentThread().interrupt(); } } public void changeFlag() { flag=false; } 或者: p

java线程中断和终止线程运行

ava中启动一个线程很容易,通常情况下我们都是等到任务运行结束后让线程自行停止.但有时需要在任务正在运行时取消他们,使得线程快速结束.对此Java并没有提供任何机制.但是我们可以通过Java提供的线程中断机制来实现. 首先来看Thread类三个和中断有关的方法: public class Thread { // 发出一个中断请求,把标志位设定为中断状态,不会终止线程运行. // 其他线程试图调用该方法,会检测是否有权限中断该线程(正常情况 // 下不会存在权限问题,这里可以忽略) public

Java并发编程-如何终止线程

我们知道使用stop().suspend()等方法在终止与恢复线程有弊端,会造成线程不安全,那么问题来了,应该如何正确终止与恢复线程呢?这里可以使用两种方法: 1.使用interrupt()中断方法. 2.使用volatile boolean变量进行控制. 在使用interrupt方法之前,有必要介绍一下中断以及与interrupt相关的方法.中断可以理解为线程的一个标志位属性,表示一个运行中的线程是否被其他线程进行了中断操作.这里提到了其他线程,所以可以认为中断是线程之间进行通信的一种方式,简

java中如何终止线程

在java早期的版本中,提供了一个终止线程的方法:stop().但在随后的版本中,这个方法被遗弃了,因为它的中断是"立即",这样有可能会造成数据不一致的情况.比如说在转账的过程中.因此在jdk1.5的时候,有一个方法出来解决这个问题:intertupt().这个方法会在run()中止,[Interrupting a thread that is not alive need not have any effect.],这样就不会造成数据不一致的问题.但是很多人在使用这个方法的时候还是出