社区
C#
帖子详情
Thread.Abort() 关闭线程问题
betatong
2003-06-12 11:52:49
我调用一个线程的 Abort() 方法,捕获 ThreadAbortException 也
还是有抛出这个异常,我现在要关闭线程,但不想抛出异常,请问
用什么方法?
注:不想用关闭程序时自动关闭线程的方法,希望能在程序中自如控制该线程的开和关。
...全文
3515
19
打赏
收藏
Thread.Abort() 关闭线程问题
我调用一个线程的 Abort() 方法,捕获 ThreadAbortException 也 还是有抛出这个异常,我现在要关闭线程,但不想抛出异常,请问 用什么方法? 注:不想用关闭程序时自动关闭线程的方法,希望能在程序中自如控制该线程的开和关。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
19 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
betatong
2003-06-13
打赏
举报
回复
哦,原来TcpListener可以这样来避免阻塞,再次感谢ArLi2003(阿利)
pipibug
2003-06-13
打赏
举报
回复
明白!
ArLi2003
2003-06-12
打赏
举报
回复
把例子中的thead_2_mustend 设置成false后不用使用abort线程“就可以自然的结束”?
对
pipibug
2003-06-12
打赏
举报
回复
ArLi2003在http://expert.csdn.net/Expert/TopicView1.asp?id=1905252中的回帖的确值得关注,刚刚拜读,不过有一点疑惑:
“变量判断中止”是指在使用abort前线设置相应的变量作记号吗?还是把例子中的thead_2_mustend 设置成false后不用使用abort线程“就可以自然的结束”?
pipibug
2003-06-12
打赏
举报
回复
哦。
Knight94是说,先abort,然后join,以确保abort的完成吧。
ArLi2003
2003-06-12
打赏
举报
回复
关于abort 异常问题可见
http://expert.csdn.net/Expert/TopicView1.asp?id=1905252
我刚回的贴子
如果你使用abort 则必须抛出异常,想避免我就不推荐使用abort(你可以使用try 忽略它)但如此的话,线程就无安全可言
pipibug
2003-06-12
打赏
举报
回复
标志 不大清楚哎,不过Join不是“阻塞调用线程,直到某个线程终止或者经过了指定的时间为止”么?如果线程是个无限循环,那么程序就其他什么也不做,等在那里了。怎么能起到abort的功能呢?
另外你说的标志不会是isalive属性吧?那可是只读的呀。
betatong
2003-06-12
打赏
举报
回复
帮助里的说明:
在调用 Abort 方法以销毁线程时,公共语言运行库将引发 ThreadAbortException。ThreadAbortException 是一种可捕获的特殊异常,但在 catch 块的结尾处它将自动被再次引发。引发此异常时,运行库将在取消线程前执行所有 finally 块。由于线程可以在 finally 块中进行未绑定的计算,因此必须调用 Join 方法以保证线程已死亡。Join 是一个阻塞调用,它要到线程实际停止执行后才返回。
我不太明白这段说明,我怎样才能避免该异常的抛出(用try-catch不行)
Knight94
2003-06-12
打赏
举报
回复
比较好的做法:通过标志,在线程中要对标志做相应的处理
然后关闭时,先打开标志,用线程Join来等待结束。
Knight94
2003-06-12
打赏
举报
回复
加入Try-catch来捕获。
ArLi2003
2003-06-12
打赏
举报
回复
虽然已经结帐,但其实socket 应该使用:
if (listener.Pending()) {
Socket sockServer = listener.AcceptSocket();
}
放在循环体就可以避免堵塞!
betatong
2003-06-12
打赏
举报
回复
发现socket 可以设置 Blocking 属性为非阻塞式的,然后再结合上面ArLi2003(阿利 无业悠民)的方法,应该可以搞定。
betatong
2003-06-12
打赏
举报
回复
能否让一个阻塞的方法变为非阻塞的调用?
devil97518
2003-06-12
打赏
举报
回复
up
betatong
2003-06-12
打赏
举报
回复
还有就是如果我用 About() 后再用 Join() , 程序会阻塞在Join() 处
betatong
2003-06-12
打赏
举报
回复
ArLi2003(阿利 无业悠民)的方法确实可以避免一些,但我这里有些特殊情况:
我的例子如下:
while(true)
{
tcpClient = tcpListener.AcceptTcpClient(); // LINE 3
...
}
我在循环里有个阻塞的方法,所以它会一直处于第三行的地方,看看有没有什么方法可以解决这个问题。
ArLi2003
2003-06-12
打赏
举报
回复
不不不,不是这个意思,我的意思是
在while 体内先判断某变量标志是否是真,以决定是否要继续循环,若结束标志相符,则不循环或跳出循环体直接到class 底部也自然就结束了。
比如
class a{
Form1 form1;
public a(Form1 obj){
form1 = obj;
}
public void op(){
while (trur){
form1.i++;
// 或其它代码
if (form1.chkBox_ThreadEnd.Checked) break; //相符就跳出循环
}
}
}
pipibug
2003-06-12
打赏
举报
回复
betatong, 至于系统抛出ThreadAbortException看来用Knight94说的标记,也就是Arli2003的变量判断的方法可以避免,而且还增加了你程序的防止死锁的安全性哦~
感谢ArLi2003的精彩回帖,和betatong的问题,使pipibug学了不少东东:)
pipibug
2003-06-12
打赏
举报
回复
哦,我明白ArLi2003的意思了。 你是说在进入某个线程后先判断某个变量,然后决定该线程是正常做工作,还是什么也不做,等到程序结束时自生自灭。这样有些线程虽然没有被abort,但是什么也不做,像行尸走肉一样。
只是这样的活着不做事的线程占用的系统资源是不是有点浪费?还是这些资源是安全应付的代价呢:)
线程
外部挂起恢复控制(不使用Suspend与Resume中止
线程
)
本人利用
Thread
.
Abort
()与
Thread
.Interrupt()可以引起目标
线程
异常的特点,开发了一种不使用已过时的方法来变相从外部控制
线程
的挂起与恢复的技术,原理简单,方便理解。 相关技术参考:...
C++
thread
退出
线程
多
线程
子
线程
控制退出主
线程
window VS2017 Debug Error!
Abort
() has been called
C++
thread
退出
线程
多
线程
子
线程
控制退出主
线程
window VS2017 Debug Error!
Abort
() has been called. C++
thread
退出
线程
多
线程
子
线程
控制退出主
线程
window VS2017 Debug Error!
Abort
() has been called.
C#多
线程
之
线程
控制详解
停止:
Thread
.
Abort
();暂停:
Thread
.Suspend();继续:
Thread
.Resume(); private void btn_Start_Click(object sender, EventArgs e) { m
Thread
.Start(); // 开始 } private void btn_Stop_Click(object sender, ...
C#.net同步异步SOCKET通讯和多
线程
总结
Thread
my
thread
; Socket socket; // 清理所有正在使用的资源。 protected override void Dispose( bool disposing ) { try { socket.Close();//释放资源 my
thread
.
Abort
( ) ;//中止
线程
} catch{ }
Windows应用程序
关闭
时如何中止正在运行的
线程
:-)当然,您可以使用
Thread
.
Abort
,并且在某些情况下应该使用
Thread
.
Abort
,但是您需要非常负责任地进行操作。 在所有情况下,您都应处理
Thread
Abort
Exception异常。 严格来说,如果这是...的最后阶段...
C#
110,536
社区成员
642,578
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章