服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - C# 使用CancellationTokenSource取消多线程

C# 使用CancellationTokenSource取消多线程

2022-11-29 12:23⎛⎝≥⏝⏝≤⎛⎝⎛⎝≥ C#

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

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

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

C# 使用CancellationTokenSource取消多线程

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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();
       }

 C# 使用CancellationTokenSource取消多线程

几点关键问题解释:

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

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

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

2: cts.Cancel()

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

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

3:cts.Token.ThrowIfCancellationRequested();

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

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

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

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

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

C# 使用CancellationTokenSource取消多线程

同时取消多个线程:

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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取消多线程的文章就介绍到这了,更多相关C# 使用CancellationTokenSource取消多线程内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/aojiancc2/article/details/84063515

延伸 · 阅读

精彩推荐
  • C#Unity Shader实现素描风格的渲染

    Unity Shader实现素描风格的渲染

    这篇文章主要为大家详细介绍了Unity Shader实现素描风格的渲染,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    vvc223c10582022-09-06
  • C#C#不重复输出一个数组中所有元素的方法

    C#不重复输出一个数组中所有元素的方法

    这篇文章主要介绍了C#不重复输出一个数组中所有元素的方法,涉及C#针对数组的遍历、校验及排序等操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    北风其凉6122021-10-11
  • C#C#操作RabbitMQ的完整实例

    C#操作RabbitMQ的完整实例

    这篇文章主要为大家详细介绍了C#操作RabbitMQ的完整实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    YSWALLE10542022-01-20
  • C#unity实现QQ截图功能

    unity实现QQ截图功能

    这篇文章主要为大家详细介绍了unity实现QQ截图功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    贪玩的孩纸时代4392022-09-02
  • C#C#实现附件上传和下载功能

    C#实现附件上传和下载功能

    这篇文章主要介绍了C#实现附件上传和下载功能,需要的朋友可以参考下...

    心路独舞5492021-11-02
  • C#Unity实现主角移动与摄像机跟随

    Unity实现主角移动与摄像机跟随

    这篇文章主要为大家详细介绍了Unity实现主角移动与摄像机跟随,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    双鱼-布衣6342022-11-07
  • C#Unity实现大转盘的简单笔记

    Unity实现大转盘的简单笔记

    这篇文章主要为大家分享了Unity实现大转盘的简单笔记,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    MiKiNuo6752022-03-10
  • C#C# NAudio 库的各种常见使用方式之播放 录制 转码 音频可视化

    C# NAudio 库的各种常见使用方式之播放 录制 转码 音频可视化

    这篇文章主要介绍了C# NAudio 库的各种常见使用方式之播放 录制 转码 音频可视化,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价...

    SlimeNull5262022-11-16