• CancellationTokenSource 取消多线程操作


    1.声明CancellationTokenSource 对象

    /// <summary>线程控制器管理</summary>
            private CancellationTokenSource cancellationManage;

    2.实例化 CancellationTokenSource 对象,此对象管理取消通知并将其发送给单个取消标记。并进行注册回调事件

     注意:想再次启动线程,必须重新再new CancellationTokenSource();因为取消了一次CancellationTokenSource.Cancel(),CancellationToken.IsCancellationRequested的标记一直为true;

      // 初始化线程控制并注册回调函数
      cancellationManage = new CancellationTokenSource();

    cancellationManage.Token.Register(CallStopThread);

     3.Cancel();方法调用会设置cancellationManage.IsCancellationRequested为True;

    调用 CancellationTokenSource.Cancel 方法以提供取消通知。 这会将 CancellationToken.IsCancellationRequested 取消标记的每个副本上的属性设置为 true 

    cancellationManage.Cancel();

    测试Demo:

     1  class Program
     2     {
     3         private static CancellationTokenSource cts = null;
     4 
     5         static void Main(string[] args)
     6         {
     7             while (true)
     8             {
     9                 Console.WriteLine("1.开始运行多线程");
    10                 Console.WriteLine("2.取消多线程");
    11                 switch (Console.ReadLine())
    12                 {
    13                     case "1":
    14                         BeginThread();
    15                         break;
    16                     case "2":
    17                         CancelThread();
    18                         break;
    19                     default:
    20                         break;
    21                 }
    22             }
    23 
    24            // Console.ReadKey();
    25         }
    26 
    27         /// <summary>
    28         /// 回调停止方法
    29         /// </summary>
    30         private static void CallStopThread()
    31         {
    32             Console.WriteLine("回调停止方法");
    33         }
    34 
    35         /// <summary>
    36         /// 取消方法
    37         /// </summary>
    38         private static void CancelThread()
    39         {
    40             cts.Cancel();
    41         }
    42 
    43         /// <summary>
    44         /// 开始运行线程方法
    45         /// </summary>
    46         private static void StartThread()
    47         {
    48             for (int i = 0; i < 1000000; i++)
    49             {
    50                 if (cts.IsCancellationRequested) break;
    51                 Console.WriteLine($"开始运行线程方法,线程ID:{Thread.CurrentThread.ManagedThreadId}");
    52                 Thread.Sleep(1000);
    53             }
    54         }
    55 
    56         /// <summary>
    57         /// 开始运行线程
    58         /// </summary>
    59         private static void BeginThread()
    60         {
    61             Console.WriteLine("开始运行1方法");
    62             cts = new CancellationTokenSource();
    63             cts.Token.Register(CallStopThread);
    64 
    65             Thread[] ths = new Thread[3];
    66             for (int i = 0; i < ths.Count(); i++)
    67             {
    68                 ths[i] = new Thread(StartThread);
    69                 ths[i].Start();
    70             }
    71             
    72         }
    73     }

    本文来自博客园,作者:云辰,转载请注明原文链接:https://www.cnblogs.com/yunchen/p/15034271.html

  • 相关阅读:
    批量修改文件
    mysql-5.5.32-linux2.6-x86_64.tar.gz 二进制源码定制安装MySQL服务器
    源码搭建nginx服务器
    Python--安装
    k8s-修改线程数
    容器卡在terminate状态无法删除
    扩/
    磁盘分区+挂载
    499
    清理磁盘
  • 原文地址:https://www.cnblogs.com/yunchen/p/15034271.html
Copyright © 2020-2023  润新知