我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C# 使用CancellationTokenSource取消多线程

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C# 使用CancellationTokenSource取消多线程

有时间我们在使用多线程的时候,需要取消线程的执行,可以使用CancellationTokenSource来取消对Task开辟多线程的取消

如下:我们点击一个按钮开启线程,然后点击取消按钮取消该线程的执行


 CancellationTokenSource cts ;
        /// <summary>
        /// 开启线程
        /// </summary>
        private void button1_Click(object sender, EventArgs e)
        {
            //重新实例化cts.Token就会不一样,不然再次点击的时候会报错,提示线程已经执行完毕
            cts = new CancellationTokenSource();
 
            Task task = new Task(() =>
            {
                Thread.Sleep(1500);
 
                try
                {
                    cts.Token.ThrowIfCancellationRequested();
                    MessageBox.Show("线程被执行");
                }
                catch (Exception ex)
                {
                    MessageBox.Show("线程被取消");
                }
 
            }, cts.Token);
            task.Start();
 
            //如果放到这里有可能线程还没有开始执行就被取消了
            //cts.Cancel(true);
        }
 
        /// <summary>
        /// 取消线程
        /// </summary>
        private void button2_Click(object sender, EventArgs e)
        {
            cts.Cancel();
        }

 

几点关键问题解释:

 1:为什么线程里边去调用 Thread.Sleep(1500);

          因为如果不让线程暂停一下,你在点击开启线程后。还没有来得及点击取消线程,线程都已经执行完毕了这个时候

          再去取消线程是没有什么意义的。

2: cts.Cancel()

          这句话其实只是设置一个状态,设置该对象一个熟悉为true而已,也就是设置cts.IsCancellationRequested为ture。

          所以他根本没有真正的去取消线程的执行,只是设置一个状态而已。

3:cts.Token.ThrowIfCancellationRequested();

          因为上面说的cts.Cancel()只是设置一个状态而已,线程不会真正被取消。其实线程开启后,现在都是要执行完的,

         我们并不能真正去取消线程的执行,只是从逻辑上去取消线程需要处理的逻辑。

         这句话的意思其实就是检查cts.Cancel()设置的属性状态,也就是cts.IsCancellationRequested是否为true,如果为

         true就抛出一个异常,从而终止线程的执行

         也就是说其实这句话完全可以我们自己来实现

同时取消多个线程:

同时取消多个线程,其实也很简单,我们不需要有多少个线程就去实例化多少个CancellationTokenSource,

多个线程绑定顶一个CancellationTokenSource的token然后调用该对象的cancel就可以同时取消多个线程了。


 CancellationTokenSource cts;
        /// <summary>
        /// 开启线程
        /// </summary>
        private void button1_Click(object sender, EventArgs e)
        {
            //重新实例化cts.Token就会不一样,不然再次点击的时候会报错,提示线程已经执行完毕
            cts = new CancellationTokenSource();
 
            for (int i = 0; i < 5; i++)
            {
                Task task = new Task((obj) =>
                {
                    Thread.Sleep(1500);
 
                    try
                    {
                        //cts.Token.ThrowIfCancellationRequested();
                        //检查状态,检查线程是否已经被取消,如果取消则自己跑出来一个线程
                        if (cts.Token.IsCancellationRequested)
                            throw new OperationCanceledException();
                        MessageBox.Show("线程" + obj + "被执行");
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("线程" + obj + "被取消");
                    }
 
                }, i, cts.Token);
                task.Start();
            }
            //如果放到这里有可能线程还没有开始执行就被取消了
            //cts.Cancel(true);
        }
 
        /// <summary>
        /// 取消线程
        /// </summary>
        private void button2_Click(object sender, EventArgs e)
        {
            cts.Cancel();
        }

到此这篇关于C# 使用CancellationTokenSource取消多线程的文章就介绍到这了,更多相关C# 使用CancellationTokenSource取消多线程内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C# 使用CancellationTokenSource取消多线程

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C#多线程编程Task如何使用

这篇“C#多线程编程Task如何使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C#多线程编程Task如何使用”文章吧。一
2023-06-29

c语言怎么使用多线程

什么是多线程?多线程是一种并发编程技术,允许程序同时执行多个任务或线程。c 语言使用 posix 线程库创建和管理线程,步骤如下:创建线程加入线程线程函数同步(使用互斥锁、条件变量和信号量)注意:共享数据时使用同步机制。错误处理对于多线程编
c语言怎么使用多线程
2024-05-21

C++多线程之使用Mutex和Critical_Section

在C++中,我们可以使用互斥锁(Mutex)和临界区(Critical Section)来实现多线程同步。**Mutex:**互斥锁是一种同步机制,它用于确保只有一个线程能够访问共享资源。当一个线程获得了互斥锁后,其他线程必须等待该线程释放
2023-09-11

C#中多线程Tread的使用(推荐)

线程是操作系统分配CPU时间的基本单元,在一个进程中可以有多个线程同时执行代码,这篇文章主要介绍了C#中多线程的使用Tread,需要的朋友可以参考下
2022-11-13

C#如何使用多线程中的lock

小编给大家分享一下C#如何使用多线程中的lock,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!经常碰到同时需要对某个数据进行操作,或者对某个文件进行读写操作,对于
2023-06-17

C# 使用多线程的几种方式

在C#中,有几种方式可以使用多线程:1. 使用Thread类:可以创建一个新线程并在其中执行指定的方法。可以使用Thread类来启动和停止线程,并检查线程的状态。以下是一个使用Thread类的例子:```csharpusing System
2023-09-15

C#异步多线程ThreadPool怎么使用

这篇文章主要讲解了“C#异步多线程ThreadPool怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#异步多线程ThreadPool怎么使用”吧!启动线程池线程ThreadPool
2023-06-25

C#多线程怎么用

这篇文章主要为大家展示了“C#多线程怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C#多线程怎么用”这篇文章吧。一、基本概念1、进程首先打开任务管理器,查看当前运行的进程:从任务管理器里面
2023-06-22

C++并发编程:如何进行线程终止和取消?

c++++ 中线程终止和取消机制包括:线程终止:std::thread::join() 阻塞当前线程直到目标线程完成执行;std::thread::detach() 从线程管理中分离目标线程。线程取消:std::thread::reques
C++并发编程:如何进行线程终止和取消?
2024-05-06

c#使用多线程的方式有哪些

在C#中,有多种方式可以使用多线程:1. 使用Thread类:可以通过创建Thread对象,并将一个方法或委托分配给它的Start方法来创建一个新线程。例如:```csharpThread thread = new Thread(SomeM
2023-08-09

C++ 多线程编程中线程池的应用

c++++ 多线程编程中使用线程池的好处包括:1)减少线程创建次数;2)负载均衡;3)避免资源争用。例如,通过使用线程池将图像转换任务分配给线程池,可以提高文件转换应用程序的转换速度。C++ 多线程编程中线程池的应用在现代 C++ 应用程
C++ 多线程编程中线程池的应用
2024-05-14

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录