• C# 使用 CancellationTokenSource 终止线程


    http://blog.csdn.net/hezheqiang/article/details/51966511

    我们在多线程中通常使用一个 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.     }

    运行效果如图

    CancellationTokenSourceTask.Factory.StartNew 创建并启动了 MyTask 方法,并传递了一个 CancellationTokenSource.Token 对象进去。我们可以通过在外部CancellationTokenSource对象进行控制是否取消任务的运行。

    当在 MyTask 中的 cancelTokenSource.IsCancellationRequested 判断如果是取消了任务的话 就跳出while循环执行。也就结束了任务

     

    我们还可以使用计时取消任务,当一个任务超过了我们所设定的时间然后自动取消该任务的执行。如下代码所示

    1.  var cancelTokenSource = new CancellationTokenSource(3000);

    除了构造函数,我们还可以使用另外一种方式实现定时取消,如下代码所示

    1.  cancelTokenSource.CancelAfter(3000);

    运行起来效果是一样的,3秒钟定时取消。

     

    多个 CancellationTokenSource 复合

    在有多个CancellationTokenSource需要一起并行管理的时候,比如任意一个任务取消 则取消所有任务。我们不必去一个一个的去关闭,只需要将需要一起并行关闭的CancellationTokenSource组合起来就行了。如下代码所示,执行结果是跟上面的图一样的。我就不再上图了。

    1.     class Program
    2.     {
    3.         //声明CancellationTokenSource对象
    4.         static CancellationTokenSource c1 = new CancellationTokenSource();
    5.         static CancellationTokenSource c2 = new CancellationTokenSource();
    6.         static CancellationTokenSource c3 = new CancellationTokenSource();
    7.  
    8.         //使用多个CancellationTokenSource进行复合管理
    9.         static CancellationTokenSource compositeCancel = CancellationTokenSource.CreateLinkedTokenSource(c1.Token, c2.Token, c3.Token);
    10.  
    11.         //程序入口
    12.         static void Main(string[] args)
    13.         {
    14.             Task.Factory.StartNew(MyTask, compositeCancel.Token);
    15.  
    16.             Console.WriteLine("请按回车键(Enter)停止");
    17.             Console.ReadLine();
    18.  
    19.             //任意一个 CancellationTokenSource 取消任务,那么所有任务都会被取消。
    20.             c1.Cancel();
    21.             
    22.             Console.WriteLine("已停止");
    23.             Console.ReadLine();
    24.         }
    25.  
    26.         //测试方法
    27.         static void MyTask()
    28.         {
    29.             //判断是否取消任务
    30.             while (!compositeCancel.IsCancellationRequested)
    31.             {
    32.                 Console.WriteLine(DateTime.Now);
    33.                 Thread.Sleep(1000);
    34.             }
    35.         }
    36.     }

    以上代码调用了MyTask()方法中的compositeCancel.IsCancellationRequested为true,则取消了任务。所以我们在所有任务中判断复合的这个CancellationTokenSource对象即可。

  • 相关阅读:
    linux 命令——19 find (转)
    linux 命令——18 locate (转)
    linux 命令——17 whereis(转)
    linux 命令——16 which(转)
    linux 命令——15 tail (转)
    linux 命令——14 head (转)
    Java for LeetCode 038 Count and Say
    Java for LeetCode 037 Sudoku Solver
    Java for LeetCode 036 Valid Sudoku
    Java for LeetCode 035 Search Insert Position
  • 原文地址:https://www.cnblogs.com/LuoEast/p/7803027.html
Copyright © 2020-2023  润新知