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取消多线程 - 剑轩的专栏 - TNBLOG

  • 16
    点赞
  • 80
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
C#是一种多线程语言,它提供了许多用于实现多线程应用程序的工具和库。在C#中,可以使用Thread类来创建和管理线程,也可以使用Task类来执行异步操作。 下面是一些深入浅出的讲解C#多线程的基础知识: 1. 线程的概念 线程是计算机中的基本执行单元。一个进程可以包含多个线程,每个线程可以独立执行特定的任务。在多线程应用程序中,多个线程可以同时执行不同的任务,提高了应用程序的性能和响应能力。 2. 线程的创建和启动 在C#中,可以使用Thread类创建和启动新线程。可以通过以下代码创建并启动一个新线程: ```csharp Thread thread = new Thread(new ThreadStart(MyMethod)); thread.Start(); ``` 其中,MyMethod是要在新线程中执行的方法。可以使用ThreadStart委托来引用该方法。 3. 线程的同步 在多线程应用程序中,如果多个线程同时访问共享资源,可能会导致数据不一致或其他问题。为了避免这些问题,可以使用线程同步机制来协调多个线程的执行。 C#中提供了多种线程同步机制,例如锁(lock)、互斥体(Mutex)、信号量(Semaphore)和事件(Event)。可以使用这些机制来确保线程间的同步和协调。 4. 线程取消 在某些情况下,需要取消正在执行的线程C#中提供了Cancellation Token机制来实现线程取消。可以使用以下代码创建Cancellation Token: ```csharp CancellationTokenSource cts = new CancellationTokenSource(); ``` 然后,可以在执行线程的任务时检查Cancellation Token,如果Cancellation Token已经被取消,则可以停止任务的执行: ```csharp if (cts.Token.IsCancellationRequested) { // 停止任务的执行 } ``` 5. 异步编程 在C#中,还可以使用异步编程模型来实现多线程应用程序。可以使用async和await关键字来定义异步方法,以及使用Task类来执行异步操作。 异步编程可以提高应用程序的性能和响应能力,同时使代码更易于阅读和维护。 以上是C#多线程的基础知识,如果想深入学习,可以查阅相关资料,例如MSDN文档或相关书籍。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值