纯净、安全、绿色的下载网站

首页|软件分类|下载排行|最新软件|IT学院

当前位置:首页IT学院IT技术

C# 取消多线程 C# 使用CancellationTokenSource取消多线程

⎛⎝≥⏝⏝≤   2021-08-16 我要评论
想了解C# 使用CancellationTokenSource取消多线程的相关内容吗⎛⎝≥⏝⏝≤⎛⎝⎛⎝≥⏝⏝≤⎛⎝在本文为您仔细讲解C# 取消多线程的相关知识和一些Code实例欢迎阅读和指正我们先划重点:C#,CancellationTokenSource取消多线程,C#,取消多线程下面大家一起来学习吧。

有时间我们在使用多线程的时候需要取消线程的执行可以使用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();
        }


相关文章

猜您喜欢

  • @ComponentScan注解使用 基于@ComponentScan注解的使用详解

    想了解基于@ComponentScan注解的使用详解的相关内容吗Code0cean在本文为您仔细讲解@ComponentScan注解使用的相关知识和一些Code实例欢迎阅读和指正我们先划重点:@ComponentScan注解,注解的使用下面大家一起来学习吧。..
  • C++LeetCode数据结构 C++LeetCode数据结构基础详解

    想了解C++LeetCode数据结构基础详解的相关内容吗caiyec在本文为您仔细讲解C++LeetCode数据结构的相关知识和一些Code实例欢迎阅读和指正我们先划重点:C++LeetCode,C++数据结构下面大家一起来学习吧。..

网友评论

Copyright 2020 www.Shellfishsoft.com 【贝软下载站】 版权所有 软件发布

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 点此查看联系方式