我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C#怎么结束线程

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C#怎么结束线程

这篇文章将为大家详细讲解有关C#怎么结束线程,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

大家都知道在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#怎么结束线程”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C#怎么结束线程

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

下载Word文档

猜你喜欢

C#怎么结束线程

这篇文章将为大家详细讲解有关C#怎么结束线程,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。大家都知道在C#里面,我们可以使用Thread.Start方法来启动一个线程,当我们想停止执行的线程时可以使用Th
2023-06-15

c语言怎么结束程序

c语言结束程序有两种方法:1. exit() 函数立即终止程序并返回退出状态;2. return 语句从 main() 函数返回时结束程序,也可以返回退出状态。C语言结束程序的两种方法在C语言中,有两种主要方法可以结束程序:1. exi
c语言怎么结束程序
2024-05-15

QT中TerminateThread不能结束线程怎么解决

在QT中,TerminateThread函数不能安全地结束线程,因为它会导致线程突然终止,可能会导致资源泄露或者死锁的情况发生。相反,应该使用其他方法来正确地结束线程。一种解决方法是使用线程取消请求。在QT中,可以使用QThread::r
QT中TerminateThread不能结束线程怎么解决
2024-02-29

qt如何强制结束线程

在Qt中,可以使用QThread类的terminate()方法来强制结束线程。该方法会发送一个终止信号给线程,并将线程状态设置为已终止。但需要注意的是,该方法可能会导致资源泄漏和未定义行为,因此应该谨慎使用。以下是使用terminate(
qt如何强制结束线程
2024-02-29

linux怎么结束进程

本篇内容介绍了“linux怎么结束进程”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!首先使用ps -ef命令确定要杀死进程的PID,然后输入
2023-06-13

mysql怎么结束进程

结束 mysql 进程有两种方法:直接方法使用 kill 命令,不推荐使用;优雅方法使用 mysqladmin 命令,需要用户具有 shutdown 权限,并通过检查进程状态确认终止。在 windows 上,可使用 taskkill 命令强
mysql怎么结束进程
2024-04-22

java怎么使用多线程解决主线程提前结束问题

这篇文章主要介绍“java怎么使用多线程解决主线程提前结束问题”,在日常操作中,相信很多人在java怎么使用多线程解决主线程提前结束问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java怎么使用多线程解决
2023-07-05

linux怎么结束oracle进程

要结束Oracle进程,可以按照以下步骤进行:1. 确认你具有管理员权限(root用户或具有sudo权限的用户)。2. 打开终端窗口。3. 使用以下命令查找正在运行的Oracle进程:```ps aux | grep oracle```这将
2023-08-23

java强制结束线程的方法是什么

在Java中,强制结束线程的方法有以下几种:1. 使用volatile变量:可以设置一个volatile类型的boolean变量,当需要结束线程时,将该变量设置为true,线程在执行过程中会不断地检查该变量的值,若为true,则退出线程。2
2023-08-24

java强行结束线程的方法是什么

Java中强行结束线程的方法是使用Thread类的interrupt()方法。该方法会向线程发送一个中断信号,如果线程处于阻塞状态,会抛出一个InterruptedException异常,否则线程的中断状态会被设置为true。被中断的线程可
2023-08-30

C#如何结束进程及子进程

这篇文章主要讲解了“C#如何结束进程及子进程”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#如何结束进程及子进程”吧!代码如下: static class ProcessExtend
2023-07-02

vb怎么强制结束进程

在VB中,可以使用`Process.Kill`方法强制结束进程。下面是一个示例代码:```vbImports System.DiagnosticsPublic Class Form1' 强制结束进程按钮的点击事件Private Sub bt
2023-10-11

python结束线程的方法有哪些

Python结束线程的方法有以下几种:1. 使用`threading`模块的`Thread`类提供的`join()`方法。调用该方法会阻塞主线程,直到指定的线程执行完毕。```pythonimport threadingdef my_fun
2023-08-24

nodejs怎么结束一个进程

Node.js 是基于 V8 引擎的 JavaScript 运行环境,是目前前端开发最常用的技术之一。在 Node.js 中,进程是一个非常重要的概念,每个 Node.js 应用程序都会启动一个进程来运行。在一些情况下,我们需要手动结束运行中的进程,本文将向你介绍如何结束 Node.js 进程。## 程序中止信号在 Node.js 中,一个进程可以接收到多个信号,这些信号可以用
2023-05-14

python怎么结束程序运行

在Python中,有几种方法可以结束程序的运行:使用sys.exit()函数:可以使用sys模块中的exit()函数来结束程序的运行。该函数接受一个可选的整数参数作为退出状态码,通常情况下,0表示成功退出,其他非零值表示异常退出。例如:im
2023-10-23

mysql怎么结束

结束 mysql 连接的方法有 5 种:使用 quit 或 exit 命令关闭客户端使用 disconnect 命令使用 end 语句使用 c api 中的 mysql_close() 函数如何结束 MySQL 连接要结束 MySQL 连
mysql怎么结束
2024-04-05

Java项目中怎么在子线程结束后执行代码

Java项目中怎么在子线程结束后执行代码?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。主线程等待子线程,然后子线程执行结束后,主线程再继续执行。主线程等待子线程需要用到:C
2023-05-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录