.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());

原文地址:https://www.cnblogs.com/Spinoza/p/10743790.html

时间: 2024-08-28 05:44:18

.net 多线程之线程取消的相关文章

POSIX多线程--线程取消

1.三种取消状态Off                   禁用取消Deferred           推迟取消:在下一个取消点执行取消Asynchronous   异步取消:可以随时执行取消 int pthread_cancel(pthread_t thread) 2.推迟取消:在下一个取消点执行取消 Pthreads系统上的某些函数会被作为取消点,如pthread_testcancel,sleep,pthread_cond_wait等.线程调用pthread_cancel函数后,被取消线程

C#多线程之线程池篇3

在上一篇C#多线程之线程池篇2中,我们主要学习了线程池和并行度以及如何实现取消选项的相关知识.在这一篇中,我们主要学习如何使用等待句柄和超时.使用计时器和使用BackgroundWorker组件的相关知识. 五.使用等待句柄和超时 在这一小节中,我们将学习如何在线程池中实现超时和正确地实现等待.具体操作步骤如下: 1.使用Visual Studio 2015创建一个新的控制台应用程序. 2.双击打开"Program.cs"文件,编写代码如下所示: 1 using System; 2 u

(转载)Linux 线程取消(Pthread_cancel)

线程取消(pthread_cancel) 基本概念pthread_cancel调用并不等待线程终止,它只提出请求.线程在取消请求(pthread_cancel)发出后会继续运行,直到到达某个取消点(CancellationPoint).取消点是线程检查是否被取消并按照请求进行动作的一个位置. 与线程取消相关的pthread函数int pthread_cancel(pthread_t thread)发送终止信号给thread线程,如果成功则返回0,否则为非0值.发送成功并不意味着thread会终止

C#多线程之线程池篇2

在上一篇C#多线程之线程池篇1中,我们主要学习了如何在线程池中调用委托以及如何在线程池中执行异步操作,在这篇中,我们将学习线程池和并行度.实现取消选项的相关知识. 三.线程池和并行度 在这一小节中,我们将学习对于大量的异步操作,使用线程池和分别使用单独的线程在性能上有什么差异性.具体操作步骤如下: 1.使用Visual Studio 2015创建一个新的控制台应用程序. 2.双击打开"Program.cs"文件,编写代码如下所示: 1 using System; 2 using Sys

线程取消 (pthread_cancel)

线程取消(pthread_cancel) 基本概念pthread_cancel调用并不等待线程终止,它只提出请求.线程在取消请求(pthread_cancel)发出后会继续运行,直到到达某个取消点(CancellationPoint).取消点是线程检查是否被取消并按照请求进行动作的一个位置. 与线程取消相关的pthread函数int pthread_cancel(pthread_t thread)发送终止信号给thread线程,如果成功则返回0,否则为非0值.发送成功并不意味着thread会终止

iOS开发多线程篇—线程的状态

iOS开发多线程篇—线程的状态 一.简单介绍 线程的创建: self.thread=[[NSThread alloc]initWithTarget:self selector:@selector(test) object:nil]; 说明:创建线程有多种方式,这里不做过多的介绍. 线程的开启: [self.thread start]; 线程的运行和阻塞: (1)设置线程阻塞1,阻塞2秒 [NSThread sleepForTimeInterval:2.0]; (2)第二种设置线程阻塞2,以当前时

Java多线程开发系列之四:玩转多线程(线程的控制1)

在前文中我们已经学习了:线程的基本情况.如何创建多线程.线程的生命周期.利用已有知识我们已经可以写出如何利用多线程处理大量任务这样简单的程序.但是当应用场景复杂时,我们还需要从管理控制入手,更好的操纵多线程.在第一节中我们讲过,使用多线程的好处之一就是我们可以通过编码和已有类库更好的管理和控制多线程.接下来我会详细的介绍如何管理多线程,包括:对线程的等待.守护线程.线程的睡眠.线程的突然停止.线程的让步.线程的优先级等.由于内容比较多,本节先介绍前两部分:对线程的等待.守护线程 1.线程的等待

线程取消

一个线程可以调用pthread_cancel来取消另一个线程.被取消的线程需要被join来释放资源.被取消的线程的返回值为PTHREAD_CANCELED 有关线程的取消,一个线程可以为如下三个状态:    1) 可异步取消:一个线程可以在任何时刻被取消.    2) 可同步取消:取消的请求被放在队列中,直到线程到达某个点,才被取消.    3) 不可取消:取消的请求被忽略.    4) 默认状态下,线程是可同步取消的. 调用pthread_setcanceltype来设定线程取消的方式:pth

C#中利用委托实现多线程跨线程操作

在使用VS2005的时候,如果你从非创建这个控件的线程中访问这个控件或者操作这个控件的话就会抛出这个异常.这是微软为了保证线程安全以及提高代码的效率所做的改进,但是也给大家带来很多不便. 其实解决这个问题有两种方法:一,是通过设置System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;在你的程序初始化的时候设置了这个属性,而且在你的控件中使用的都是微软Framework类库中的控件的话,系统就不会再抛出你上面所说的