zoukankan      html  css  js  c++  java
  • .net 多线程之线程取消

     1  //线程取消不是操作线程,而是操作信号量(共享变量,多个线程都能访问到的东西,变量/数据库的数据/硬盘数据)
     2                 //每个线程在执行的过程中,经常去查看下这个信号量,然后自己结束自己
     3                 //线程不能别人终止,只能自己干掉自己,延迟是少不了的
     4                 //CancellationTokenSource可以在cancel后,取消没有启动的任务
     5                 CancellationTokenSource cts = new CancellationTokenSource();//bool值
     6                 for (int i = 0; i < 40; i++)
     7                 {
     8                     string name = string.Format("btnThreadCore_Click{0}", i);
     9                     Action<object> act = t =>
    10                     {
    11                         try
    12                         {
    13                             //if (cts.IsCancellationRequested)
    14                             //{
    15                             //    Console.WriteLine("{0} 取消一个任务的执行", t);
    16                             //}
    17                             Thread.Sleep(2000);
    18                             if (t.ToString().Equals("btnThreadCore_Click11"))
    19                             {
    20                                 throw new Exception(string.Format("{0} 执行失败", t));
    21                             }
    22                             if (t.ToString().Equals("btnThreadCore_Click12"))
    23                             {
    24                                 throw new Exception(string.Format("{0} 执行失败", t));
    25                             }
    26                             if (cts.IsCancellationRequested)//检查信号量,是否已经取消这个cts
    27                             {
    28                                 Console.WriteLine("{0} 放弃执行", t);
    29                                 //return;
    30                             }
    31                             else
    32                             {
    33                                 Console.WriteLine("{0} 执行成功", t);
    34                             }
    35                         }
    36                         catch (Exception ex)
    37                         {
    38                             //传达取消请求
    39                             cts.Cancel();
    40                             Console.WriteLine(ex.Message);
    41                         }
    42                     };
    43                     //cts.Token cts被设置为取消状态后可以自动抛出异常,后面的线程就都不启动了
    44                     taskList.Add(taskFactory.StartNew(act, name, cts.Token));
    45                 }
    46                 Task.WaitAll(taskList.ToArray());
  • 相关阅读:
    动态规划法(八)最大子数组问题(maximum subarray problem)
    动态规划法(九)想要更多例子?
    动态规划法(五)钢条切割问题(rod cutting problem)
    MySql排序函数
    Mysql 分组函数查询
    MySql单行函数
    MySql常见的函数
    MySql常见的条件查询
    MySql的一些基础查询
    MySql资料总全
  • 原文地址:https://www.cnblogs.com/Spinoza/p/10743790.html
Copyright © 2011-2022 走看看