[C#]“正在终止线程”的问题
在C#中启用线程后,如果试图使用Abort方法来终止线程,那么必定会抛出“正在终止线程”的异常,一开始我也想过如何来避免这种异常出现,花了不少气力,但最后发现全是徒劳。
原因是一个正在运行的线程被终止在C#的机制中是属于非正常结束,所以必定会爆出异常,所以我们也大可不必因为在代码方面的“洁癖”非得找到一个方法来阻止这种异常出现。
也有人提出采用join()方法来阻止,但很多情况下这并不能完全满足我们的要求,比如我们有一个后台的监听线程,如果我们的确想终止它,如果我们采用了join方法,那么我们不想发生的情况就会出现,我们的界面会因为执行了join而卡死在那里,为什么呢?因为我们的监听线程一般来说都是一个持续运行的线程,所以我们大可不必因为介意爆出异常而采用join的方法而导致程序假死。
我也在网上看见有人提出过,要终止线程最好是在执行线程的代码中自然终止,这个说法本身没有错,但对于我上面说到的监听线程,要自然结束是不可能办到的。
从上面的分析我们可以看出,C#中的线程一旦开启,那么只有等这个线程执行完,自然结束,自然被系统回收才不会爆出异常,任何一种外部的强制中断都会被认为是异常的,任意一个线程在本质上都和我们的主线程(Main函数所在的线程)一样,都必须按照顺序执行完所有的语句方才结束当前线程,如果在所有的语句没有执行完的时候就被终止了,这至少是与我们设计的理想状态有差异的。
所以我觉得在遇到C#中的“正在终止线程”异常的时候,可以大胆的用try{}catch()来处理(丢弃异常信息或将异常友好化),而不是阻止这个异常的出现,阻止这个异常的出现明显有两个坏处:
第一、耗费的代价实在太高
第二、对于线程的干涉手段过于复杂,不便于维护线程
我的解决方法是:
按 “停止” 按钮后,赋值某个变量为False,在线程执行的循环任务While、Foreach 里加上判断语句 if (!tt) { continue; },效果为按下停止按钮后,跳出循环。。等同于不执行任务了,其实线程还没有关闭,只是在空闲中,可以新开一个线程在后台关闭线程1,然后再自动关闭自身。这样也解决了t1.Join();卡死界面的问题。
[C#]“正在终止线程”的问题的更多相关文章
- Java终止线程
Thread提供了stop()方法终止线程,但是该方法是强行终止,容易产生一些错误,已经被废弃. 可以使用退出标志来终止线程,在run()函数里面设置while循环,把退出标志作为while的条件,当 ...
- C# 在异步中使用HttpWebRequest出现的“正在终止线程”错误的解决方案
最近做接口对接,因需求变化需要用到异步推送信息,就利用委托做了异步. 程序运行过程中时不时出现“正在终止线程”的错误信息,导致两边订单信息不一致,代码如下: byte[] byteData = Enc ...
- Android终止线程的方法
线程对象属于一次性消耗品,一般线程执行完run方法之后,线程就正常结束了,线程结束之后就报废了,不能再次start,只能新建一个线程对象.但有时run方法是永远不会结束的.例如在程序中使用线程进行So ...
- java线程中断和终止线程运行
ava中启动一个线程很容易,通常情况下我们都是等到任务运行结束后让线程自行停止.但有时需要在任务正在运行时取消他们,使得线程快速结束.对此Java并没有提供任何机制.但是我们可以通过Java提供的线程 ...
- 1. Server.Transfer跳转页面抛出异常:正在终止线程
今天在向数据库插入数据,之后使用Server.Transfer跳回本页面时,抛出异常:正在终止线程 ry { == String.Compare(Password.Text.Trim(), Confi ...
- Java线程池ThreadPoolExecutor使用和分析(三) - 终止线程池原理
相关文章目录: Java线程池ThreadPoolExecutor使用和分析(一) Java线程池ThreadPoolExecutor使用和分析(二) - execute()原理 Java线程池Thr ...
- C#多线程之旅(7)——终止线程
先交代下背景,写<C#多线程之旅>这个系列文章主要是因为以下几个原因:1.多线程在C/S和B/S架构中用得是非常多的;2.而且多线程的使用是非常复杂的,如果没有用好,容易造成很多问题. ...
- 《Java并发编程》之线程中断与终止线程运行
Java中启动一个线程很容易,通常情况下我们都是等到任务运行结束后让线程自行停止.但有时需要在任务正在运行时取消他们,使得线程快速结束.对此Java并没有提供任何机制.但是我们可以通过Java提供的线 ...
- C# 使用 CancellationTokenSource 终止线程
http://blog.csdn.net/hezheqiang/article/details/51966511 我们在多线程中通常使用一个 C# 使用 CancellationTokenSource ...
- C# CancellationTokenSource 终止线程 CancellationTokenSource实现对超时任务的取消
C# 使用 CancellationTokenSource 终止线程 使用CancellationTokenSource对象需要与Task对象进行配合使用,Task会对当前运行的状态进行控制(这个不用 ...
随机推荐
- GreenDao在列中的单词之间自动加_
1.第一种情况,原字段(属性.列)是 驼峰式命名法 @Entitypublic class Employee { @Id(autoincrement = true) private Long id; ...
- js 判断整数
参考 https://blog.csdn.net/tangxiujiang/article/details/78073792 1.使用取余运算符(%) + 判断对象是否是数字来判断: 注意:空字符串. ...
- NDK环境搭建方法2
1.新建项目NDKDemo3 2.新建com.example.shixm.ndkdemo3.MyNdk.java 3.右键main文件夹,New->Folder->JNI Folder 4 ...
- jenkins权限控制
一.插件安装 插件:Role-based Authorization Strategy版本:2.3.2 二.全局安全配置 进入Jenkins后点击系统管理进入全局安全配置 当插件安装好的时候,授权策略 ...
- TZOJ 4871 文化之旅(floyd预处理+dfs剪枝)
描述 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一种文化超过一次,即如果他学习了某种文化,则他就不能到达其他有这种文化的国家.不同的国家可能有相同的文化.不同文化的国家 ...
- 在eclipse上写代码的时候,tomcat突然不能用了,重启都是闪一下就关了
严重: A child container failed during start 严重: The required Server component failed to start so Tomca ...
- Python使用SMTP发送邮件(163,yeah等网易邮箱已测试可以)
#! /usr/bin/env python# -*- coding: UTF-8 -*-import smtplibfrom email.mime.text import MIMETextmailt ...
- js substring
substring的起始为左闭右开区间,也就是[1,3)结束位置为2,千万不要搞错了哦. 其他关于这个点的资料连接 聊聊左闭右开区间:https://www.cnblogs.com/owenandhi ...
- 关于transform-style:preserve-3d的些许明了
父元素要添加属性transform-style:preserve-3d;和transform:perspective(800px);还有相对定位 首先设置子元素 具有3D属性,然后再设置视角与3D元素 ...
- STL set,mulityset用法
#include<iostream> #include <set> using namespace std; template <class T> class Ru ...