• .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());
  • 相关阅读:
    【入门】WebRTC知识点概览 | 内有技术干货免费下载
    mysql数据库运维方案
    前端报504错误如何定位
    Python数据分析之双色球高频数据统计
    利用Dapper ORM搭建三层架构
    ASP.NET和IIS工作原理
    C#中的new修饰符
    .NET 三层架构的简单规划
    Docker Hub中拉取镜像时出现超时问题该如何做?
    项目组件:分页(pagination)
  • 原文地址:https://www.cnblogs.com/Spinoza/p/10743790.html
Copyright © 2020-2023  润新知