码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-06-27 19:41:33      阅读:2826      评论:0      收藏:0      [点我收藏+]

标签:

C# 使用 CancellationTokenSource 终止线程

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

下面我们来看看示例代码

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

 

在基于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);

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

标签:

原文地址:http://www.cnblogs.com/wlzhang/p/4604471.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!