C#多线程之旅(七)——终止线程
阅读目录
- 一、什么时候用Thread.Abort();
- 二、Thread.Abort的用法
- 三、无法终止线程的情形
- 四、Catch块中抛出异常
- 五、Finally块中抛出异常
- 六、Abort调用的时间
先交代下背景,写《C#多线程之旅》这个系列文章主要是因为以下几个原因:1.多线程在C/S和B/S架构中用得是非常多的;2.而且多线程的使用是非常复杂的,如果没有用好,容易造成很多问题。
回到顶部
一、什么时候用Thread.Abort();
当我们想要立即终止一个线程时,可以用调用Thread.Abort方法来终止线程。这个和协作式取消不一样。
终止当前线程时会在当前线程上引发ThreadAbortException 异常。ThreadAbortExcetion是一个可以被应用程序捕获的特殊异常,在catch 块中会自动重新抛出这个异常,除非在catch块中调用ResetAbort方法。ResetAbort方法可以取消掉终止的请求,而且可以防止catch中再次抛出的ThreadAbortException终止当前线程。未执行的Finally块会在线程终止前执行。
回到顶部
二、Thread.Abort的用法
例子:
|
||||||||||||||
(1)调用Thread.Abort()的输出结果: (2)未调用Thread.Abort()输出结果: (3)流程: (1)当主线程调用myThread.Abort()后,线程myThread抛出异常,线程myThread捕获到异常 (2)在myThread catch块中 如果调用Thread.ResetAbort()----- Step1.取消终止线程的请求,并恢复线程,继续执行ResetAbort后面的语句,然后执行catch块之后的语句 Step2.若catch块之后有Finally块,则执行执行Finally块,然后执行Finally块后面的语句。 如果没有调用Thread.ResetAbort()---- 1.finally块在线程终止前执行,finally块之后的语句不会被执行,然后线程终止。 |
回到顶部
三、无法终止线程的情形
当调用线程的Abort方法时,不能保证线程立即终止,有可能永远不能终止。这种情形发生在catch或finally块中存在长时间或无限的耗时操作时。
只有当catch或finally块中代码执行完才能终止线程。所以我们可以调用线程的Join方法来等待线程的完成或终止。
回到顶部
四、Catch块中抛出异常
应用程序将会被终止,Finally块不会被执行
回到顶部
五、Finally块中抛出异常
应用程序将会被终止
回到顶部
六、Abort调用的时间
(1)线程Start之前调用Abort
线程会在Start被调用时终止线程。
(2)线程Sleeping的时候调用Abort
线程被中断,然后终止线程
(3)线程Blocked的时候调用Abort
线程被中断,然后终止线程
(4)线程被挂起的时候调用Abort
Throw ThreadStartException 引发Abort的调用,然后AbortRequested 被加到正在被终止的线程的ThreadState属性
(5)一个托管线程正在执行非托管代码时调用Abort
ThreadAbortException不会被抛出直到线程返回托管代码。
(6)如果同时Abort两个线程,有可能一个线程会设置状态信息,而另外一个线程执行Abort的方法。然而,应用程序不会检测到这种情形。
作 者: Jackson0714
出 处:http://www.cnblogs.com/jackson0714/
关于作者:专注于微软平台的项目开发。如有问题或建议,请多多赐教!
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
特此声明:所有评论和私信都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。或者直接私信我
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是作者坚持原创和持续写作的最大动力!
C#多线程之旅(七)——终止线程相关推荐
- 多线程之旅七——GUI线程模型,消息的投递(post)与处理
基于消息的GUI构架 在过去的日子中,大部分编程语言平台的GUI构架几乎没有发生变化.虽然在细节上存在一些差异,比如在功能和编程风格上,但大部分都是采用了相同的构架来响应用户输入以及重新绘制屏幕.这种 ...
- java线程 stop()_java 多线程5: java 终止线程及中断机制 (stop()、interrupt() 、interrupted()、isInterrupted())...
JAVA中有3种方式可以终止正在运行的线程 ①线程正常退出,即run()方法执行完毕了 ②使用Thread类中的stop()方法强行终止线程.但stop()方法已经过期了,不推荐使用 ③使用中断机制i ...
- C#多线程之旅(3)——线程池
阅读目录 代码下载 一.介绍 二.通过TPL进入线程池 三.不用TPL进入到线程池 v博客前言 先交代下背景,写<C#多线程之旅>这个系列文章主要是因为以下几个原因:1.多线程在C/S和B ...
- Java 多线程(七) 线程间的通信
Java 多线程(七) 线程间的通信--wait及notify方法 线程间的相互作用 线程间的相互作用:线程之间需要一些协调通信,来共同完成一件任务. Object类中相关的方法有两个notify方法 ...
- 详解java中Thread类,线程和进程的基本区别,多线程的好处,线程的五个生命周期,主线程和IDEA创建的Monitor Ctrl-Break守护线程;优雅地终止线程。死锁的产生
线程:CPU调度的最小单位:线程共享堆内存和方法区,但各自享有栈空间.进程:CPU分配资源的最小单位. 为什么需要多线程:①避免其中一个模块阻塞造成系统假死:②程序异步处理(交替执行),提高程序执行效 ...
- 【C/C++多线程编程之四】终止pthread线程
多线程编程之终止pthread线程 Pthread是 POSIX threads 的简称,是POSIX的线程标准. 终止线程似乎是多线程编程的最后一步,但绝不是本系列教材的结束.线 ...
- Java多线程(七)——线程中断
目录 一.引言 二.stop与interrupt 三.非阻塞线程被interrupt 四.阻塞线程被interrupt 五.总结 一.引言 线程中断在开始没有特别重视,多线程往后学习才发现线程中断也是 ...
- 【多线程编程学习笔记6】终止线程执行,千万别踩这个坑!
申明:本学习笔记是在该教程的基础上结合自己的学习情况进行的总结,不是原创,想要看原版的请看C语言中文网的多线程编程(C语言+Linux),该网站有很多好的编程学习教程,尤其是关于C语言的. 在< ...
- windows C++多线程(三):线程终止结束ExitThread与TerminateThread
终止线程运行,最好的方法是自然返回return结束.在微软创建多线程API时,C/C++运行时库还不太成熟,导致一些API的调用与CRT会出冲突,使用CreateThread创建线程,并不是很推荐的, ...
最新文章
- Spring Cloud 2021.0.1 发布
- Uboot分析(三)
- 远程办公第五天,你还在扩容吗?
- 基于Wemos D1的感应开盖垃圾桶
- 云+AI+5G时代,华为云已准备好多元化云服务架构
- 2-4实战分类之模型构建
- c#中字符串截取使用的方法
- 简单内网映射到公网方法--免费
- 英雄传奇-6.专用浏览器打不开.黑屏.白屏.插件丢失等怎么解决
- 编译原理-第一节(东南大学廖力老师)
- AdventureWorks2008 数据库安装
- 软件安全性验收测试 软件测试常见报告类型
- 网易有道笔试题(2014届,2013.10北邮站)
- J1800N-D2H主板升级bios,安装Fedora20,并搭建开发环境
- 以太坊中的事件机制Feed
- 微信企业号加密异常处理:InvalidKeyException
- 【实战技能】从《Beautiful Teams》一书看团队
- 计算机技术cae是什么意思,什么是CAE?有那些用途?请赐教 爱问知识人
- 机场精细化管理_【青海机场公司召开“强化‘三基’固根本 精益管理促发展”主题交流会议】...
- b2DebugDraw到底是什么
热门文章
- 解决ffmpeg拉流转发频繁丢包问题max delay reached. need to consume packet
- Java虚拟机(JVM)默认字符集详解
- 矩阵快速幂 HDU3483
- UCScript——C++集成脚本
- 通过JavaScript操作HTML中select标签
- 401 binary watch
- [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第19篇]Shamir密钥交换场景
- [Leetcode][第79题][JAVA][单词搜索][DFS][回溯]
- [剑指offer]面试题第[6]题[JAVA][旋转数组的最小数字][二分法]
- flex 下对齐_flex布局