首页 > 编程语言 >C# 使用CancellationTokenSource取消多线程

C# 使用CancellationTokenSource取消多线程

时间:2022-11-12 09:56:34浏览次数:70  
标签:cts C# CancellationTokenSource 取消 Token 线程 Cancel 多线程

原文网址:https://blog.csdn.net/xwnxwn/article/details/115670973

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

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

 

原文地址:
————————————————
版权声明:本文为CSDN博主「aojiancc2」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/aojiancc2/article/details/84063515

标签:cts,C#,CancellationTokenSource,取消,Token,线程,Cancel,多线程
From: https://www.cnblogs.com/bruce1992/p/16882744.html

相关文章