zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Jar包管理规范
    Base64编码原理与应用
    MySQL 5.7.14安装说明,解决服务无法启动
    idea注册
    Oracle 如何对中文字段进行排序
    SVN错误:Attempted to lock an already-locked dir
    排序算法
    设计模式
    分层
    阿里云
  • 原文地址:https://www.cnblogs.com/yunchen/p/15034271.html
Copyright © 2011-2022 走看看