iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C#如何优雅的结束线程
  • 665
分享到

C#如何优雅的结束线程

2024-04-02 19:04:59 665人浏览 八月长安
摘要

大家都知道在C#里面,我们可以使用Thread.Start方法来启动一个线程,当我们想停止执行的线程时可以使用Thread.Abort方法来强制停止正在执行的线程,但是请注意,你确定

大家都知道在C#里面,我们可以使用Thread.Start方法来启动一个线程,当我们想停止执行的线程时可以使用Thread.Abort方法来强制停止正在执行的线程,但是请注意,你确定调用了Thread.Abort方法后线程就立刻停止了吗?答案是:不是!

下面我们来解释一下Abort方法是如何工作的。因为公用语言运行时管理了所有的托管的线程,同样它能在每个线程内抛出异常。Abort方法能在目标线程中抛出一个ThreadAbortException异常从而导致目标线程的终止。不过Abort方法被调用后,目标线程可能并不是马上就终止了。因为只要目标线程正在调用非托管的代码而且还没有返回的话,该线程就不会立即终止。而如果目标线程在调用非托管的代码而且陷入了一个死循环的话,该目标线程就根本不会终止。不过这种情况只是一些特例,更多的情况是目标线程在调用托管的代码,一旦Abort被调用那么该线程就立即终止了。

其实一个线程在运行时,我们可以通过Thread.ThreadState属性读出它的状态,正在运行的线程状态就是ThreadState.Running。然后如果我们想强制停止正在执行的线程,就会调用Thread.Abort方法,但是Thread.Abort方法做的事情只是在线程上抛出了一个ThreadAbortException异常,然后将线程的状态置为ThreadState.AbortRequested,MSDN对AbortRequested状态的解释是:已对线程调用了 Thread.Abort 方法,但线程尚未收到试图终止它的挂起的System.Threading.ThreadAbortException,也就是说线程在ThreadState.AbortRequested状态时表示即将结束但是还没有真正结束。可是Thread.Abort方法将线程的状态置为ThreadState.AbortRequested后就立马返回了,而线程真正结束后的状态应该是ThreadState.Aborted,所以一定要注意在调用了Thread.Abort方法后,要记得循环检查Thread.ThreadState属性的值或者调用Thread.Join方法来确保被终止线程已经真正停止,只有当Thread.ThreadState属性为Aborted或Thread.Join方法返回时,才表示线程真正结束了。

下面我就写一个示例代码来说明在调用Thread.Abort方法后,怎样保证线程停止后代码才会继续执行


var thread = new Thread(  
    new ThreadStart(  
        () =>  
            {  
                while (true)  
                {  
                    //该线程会进行无限循环,自己不会结束  
                    Thread.Sleep(100);  
                }  
            }));  
  
thread.IsBackground = true;  
thread.Start();//启动线程  
  
thread.Abort();//调用Thread.Abort方法试图强制终止thread线程  
  
//上面调用Thread.Abort方法后线程thread不一定马上就被终止了,所以我们在这里写了个循环来做检查,看线程thread是否已经真正停止。其实也可以在这里使用Thread.Join方法来等待线程thread终止,Thread.Join方法做的事情和我们在这里写的循环效果是一样的,都是阻塞主线程直到thread线程终止为止  
while (thread.ThreadState!=ThreadState.Aborted)  
{  
    //当调用Abort方法后,如果thread线程的状态不为Aborted,主线程就一直在这里做循环,直到thread线程的状态变为Aborted为止  
    Thread.Sleep(100);  
}  
  
//当跳出上面的循环后就表示我们启动的线程thread已经完全终止了  
var thread = new Thread(
    new ThreadStart(
        () =>
            {
                while (true)
                {
                    //该线程会进行无限循环,自己不会结束
                    Thread.Sleep(100);
                }
            }));

thread.IsBackground = true;
thread.Start();//启动线程

thread.Abort();//调用Thread.Abort方法试图强制终止thread线程

//上面调用Thread.Abort方法后线程thread不一定马上就被终止了,所以我们在这里写了个循环来做检查,看线程thread是否已经真正停止。其实也可以在这里使用Thread.Join方法来等待线程thread终止,Thread.Join方法做的事情和我们在这里写的循环效果是一样的,都是阻塞主线程直到thread线程终止为止
while (thread.ThreadState!=ThreadState.Aborted)
{
    //当调用Abort方法后,如果thread线程的状态不为Aborted,主线程就一直在这里做循环,直到thread线程的状态变为Aborted为止
    Thread.Sleep(100);
}

//当跳出上面的循环后就表示我们启动的线程thread已经完全终止了

不过请记住使用Thread.Abort方法来终止正在执行的线程并不是一个好的方法,因为Abort方法是通过在线程上抛异常来终止线程的,这样可能会产生一些意想不到的问题。最好的办法是在启动的线程中加信号灯,当想要终止线程执行时就更改信号灯的状态,启动的线程当读到信号灯状态改变后自己结束代码的执行,这才是最安全的做法。

将一个信号灯标志位置位true,然后就等待这个线程顺利结束:


USBOP.ThreadStopFlg = true;           
while ((USBReadThread.ThreadState != System.Threading.ThreadState.Stopped) && (USBReadThread.ThreadState != System.Threading.ThreadState.Aborted))  
{  
    Thread.Sleep(10);  
}  
USBOP.ThreadStopFlg = true;         
while ((USBReadThread.ThreadState != System.Threading.ThreadState.Stopped) && (USBReadThread.ThreadState != System.Threading.ThreadState.Aborted))
{
    Thread.Sleep(10);
}

在USBReadThread这个线程的循环里,会一直这样检测:


if (ThreadStopFlg == true) //判断是否该结束线程了  
{  
    ThreadStopFlg = false;  
    return;  
}  

到此这篇关于C#如何优雅的结束一个线程的文章就介绍到这了,更多相关C#结束线程内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C#如何优雅的结束线程

本文链接: https://www.lsjlt.com/news/125735.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • C#如何优雅的结束线程
    大家都知道在C#里面,我们可以使用Thread.Start方法来启动一个线程,当我们想停止执行的线程时可以使用Thread.Abort方法来强制停止正在执行的线程,但是请注意,你确定...
    99+
    2022-11-12
  • 详解C#如何优雅地终止线程
    目录需求说明初始版本进阶版本最终版本在刚接触后台线程的时候,觉得线程神秘且高深,并且时常有先辈们千叮万嘱:能不用的时候,尽量不要用,千万不要滥用线程,否则会发生预料不到的结果。在接触...
    99+
    2023-03-21
    C#终止线程 C#线程
  • C#如何结束进程及子进程
    这篇文章主要讲解了“C#如何结束进程及子进程”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#如何结束进程及子进程”吧!代码如下:    static...
    99+
    2023-07-02
  • 【Java】如何优雅的关闭线程池
    文章目录 背景一、线程中断 interrupt二、线程池的关闭 shutdown 方法2.1、第一步:advanceRunState(SHUTDOWN) 把线程池置为 SHUTDOWN2.2、...
    99+
    2023-09-21
    java 开发语言
  • python多线程编程:如何优雅地关闭线程
    在并发编程中,我们可能会创建新线程,并在其中运行任务,可能由于一些原因,决定停止该线程。例如: 不再需要线程任务的结果了。应用程序正在关闭。线程执行可能已经出现了异常 关于python多线程编程知...
    99+
    2023-09-04
    python 开发语言
  • python如何结束程序运行,python结束程序的语句
    大家好,小编为大家解答python结束程序的代码用什么符号的问题。很多人还不知道python如何结束程序运行,现在让我们一起来看看吧! Python停止全部代码:如何优雅地结束程序 在Python编程中,有时候我们需要在程序运行...
    99+
    2023-09-15
    服务器
  • Python的子线程和子进程是如何手动结束的?
    如何结束Python的子线程和子进程 结束子线程的方法: 这个是搬运其他大神的代码,鄙人也不知道原理,反正拿来主义,暂时没发现什么缺点,先用着再说。 import inspect...
    99+
    2022-11-12
  • 详解在SpringBoot如何优雅的使用多线程
    目录快速使用 获取异步方法返回值 注意事项 本文带你快速了解@Async注解的用法,包括异步方法无返回值、有返回值,最后总结了@Async注解失效的几个...
    99+
    2023-02-07
    SpringBoot优雅使用多线程 SpringBoot多线程
  • C++如何实现结束应用进程小工具
    这篇文章给大家分享的是有关C++如何实现结束应用进程小工具的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。C++实现结束应用进程小工具(windows)说明:在电脑上一些软件或系统有时可能会将程序偷偷运行在后台,占...
    99+
    2023-06-15
  • Java结束线程的三种方法及该如何选择
    目录1.使用退出标志2.使用interrupt方法3.使用stop方法来结束线程4.结束方法的选择java常用的结束一个运行中的线程的方法有3中:使用退出标志,使用interrupt...
    99+
    2022-11-11
  • Java如何判断线程是否结束的三种方法
    目录方法1方法2方法3方法1 通过Thread类中的isAlive()方法判断线程是否处于活动状态。 线程启动后,只要没有运行完毕,都会返回true。 【注】如果只是要等其他线程运行...
    99+
    2022-11-13
  • 如何让主线程等待所有的子线程结束之后再执行
    本篇内容主要讲解“如何让主线程等待所有的子线程结束之后再执行”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何让主线程等待所有的子线程结束之后再执行”吧!使用T...
    99+
    2022-10-19
  • Java中该如何优雅的使用线程池详解
    目录为什么要用线程池?线程池线程池基本概念线程池接口定义和实现类ExecutorServiceScheduledExecutorService线程池工具类newFixedThread...
    99+
    2022-11-12
  • 详解Java线程池如何实现优雅退出
    目录shutdown()方法shutdownNow()方法awaitTermination(long, TimeUnit)方法在【高并发专题】中,我们从源码角度深度分析了线程池中那些...
    99+
    2022-11-13
  • 如何理解Volatile+Interrupt是停止线程优雅的姿势
    本篇内容主要讲解“如何理解Volatile+Interrupt是停止线程优雅的姿势”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解Volatile+Int...
    99+
    2022-10-19
  • C++ 中如何结束 while (cin>>str) 的输入
    目录如何结束 while (cin>>str) 的输入cinwindow 下linux 下while(cin>>str);auto;find();方法一SET...
    99+
    2022-11-13
  • 详解C#WinForm如何优雅的处理异常
    目录场景需求开发环境开发工具实现代码实现效果代码解析场景 在运行、调试代码的时候,往往会遇到一些异常情况,很多时候我们代码写得足够健壮,所以出现的概率比较低,但是如果一旦出现,我们又...
    99+
    2022-11-13
  • 如何进行C++代码的优雅异常处理?
    如何进行C++代码的优雅异常处理?在编程过程中,异常处理是一个重要的方面。异常处理可以帮助我们在代码执行过程中处理意外情况,保证程序的稳定性和可靠性。在C++中,异常处理的机制能有效地捕获和处理错误,从而帮助我们优雅地处理异常情况。本文将介...
    99+
    2023-11-02
    异常处理 (Exception Handling) C++编程 (C++ programming) 优雅异常 (Grac
  • Go如何优雅的关闭goroutine协程
    目录1.简介2.为什么需要关闭goroutine2.1 协程的生命周期2.2 协程的终止条件2.3 为什么需要主动关闭goroutine3.如何优雅得关闭goroutine3.1 传...
    99+
    2023-05-20
    Go关闭goroutine协程 Go关闭goroutine Go关闭协程
  • C++开发建议:如何进行C++代码优雅的错误处理
    C++开发建议:如何进行C++代码优雅的错误处理引言:在C++开发中,错误处理是一项重要的技术,它涉及如何识别错误、处理异常情况以及保证程序的正常运行。良好的错误处理机制可以提高代码的可维护性和可靠性,而糟糕的错误处理可能导致程序崩溃、资源...
    99+
    2023-11-22
    错误处理 C++编程 优雅处理
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作