日期:2014-05-19  浏览次数:21162 次

多线程问题:调用Abort()方法关闭线程的时候会出现TreadAbortException异常,如何解决?
初学多线程,在调用Abort()方法关闭线程的时候碰上一个问题:
调用Abort()方法关闭线程的时候,系统会抛出一个TreadAbortException异常关闭此线程,这个MSDN上有说明没什么问题,但奇怪的是,我采用调试模式运行程序的时候怎么测试都不会出现TreadAbortException异常(线程正常关闭),但直接运行BIN\DEBUG文件中生成的程序文件运行的时候,同样的操作就会产生“正在关闭线程,未处理的TreadAbortException异常”。。。。。由于不能调试,实在弄不清楚原因,实在没办法只能尝试捕捉此异常进行处理,但后面测试发现异常可以正确捕捉到,但仍然继续提示“正在关闭线程,未处理的TreadAbortException异常”。。。。。而且一出就是2次,吻合MSDN中对此异常的描述:此异常会再调用方法的时候抛出一次,在CATCH块结尾时再抛出一次

实在不明白原因和解决方法,只好求教于各位了,非常感谢

上面写得可能有点乱,其实就两个问题:1、怎么有效的关闭线程   2、用Abort()方法关闭线程的时候,怎么能确保不抛出TreadAbortException异常(或保证抛出了但不提示,否则用户会以为程序出了什么大问题=.=)

------解决方案--------------------
Abort()方法本来就会引发TreadAbortException异常。一般的做法是,不用Abort()来终止线程。而是在线程内终止操作来使线程中止。
------解决方案--------------------
定义一个静态变量,作为线程退出的标志。如果主线程要工作者线程退出的话,直接设置这个变量的值就行了!
------解决方案--------------------
不知道你是什么问题,这是一个通知异常,忽略不处理即可。不会传播到父线程。
------解决方案--------------------
shield0771(shield) ( ) 信誉:100 Blog 加为好友 2007-05-16 08:51:37 得分: 0


to wzd24(牧野) 请问线程内部关闭线程的命令是什么?
--------------------------------------------
没有什么内部关闭线程的命令,你直接在这个线程的函数里面return,线程就会自动终止。
------解决方案--------------------
Abort()方法就是用这个异常来停止线程的
这个异常可以手工抛出
不过会不会出问题就不太清楚了

如果线程已经用过一次Abort()被你捕获了的话,再用Abort()方法好象就不会再有反应了
我倒觉得关闭线程的方法最好就是让他自己运行结束
如果是循环的话不妨试试用bool变量来控制循环
------解决方案--------------------
应该在OpenWaitingForm函数里面try catch
abort引起的异常是在线程的函数里面。
你还有就是你在finally里面调用了abort就不用在try那里再加了,
finally的语句肯定是会被执行的。
------解决方案--------------------
Abort是强制线程产生一个AbortException来终止线程的但并非一定就能终止,
最好的做法是在线程执行体中,使用一个退出标志来退出线程,
或者一定要使用Abort的话,调用Abort后在调用Join方法
------解决方案--------------------
1、finally里面的代码总是会执行,所以不需要第一个Thread.Abort。
2、不应在非主线程中调用Application.Run方法,至少会出现一些莫名其妙的问题。
------解决方案--------------------
只在主线程操作界面,不要在子线程操作界面如mainform.button1.Text = "abc "; 之类的操作。
------解决方案--------------------
应该说有两种解释:
1、Application.Run接到异常后,会抛出错误对话框然后结束进程。
2、Application.Run接到ThreadAbortExcepsion的异常后,会终止进程关闭所有线程,导致主线程接到ThreadAbortException异常。

当然,通过试验和反编译代码,我们应该能确定原因。
------解决方案--------------------
Application.Run(waitingForm);

改为waitingForm.Show();

你第二个线程把第一个强制弄断了,Application.Run这个东西应该只有一次,比如主窗体显示,以后的窗体不应该用它
------解决方案--------------------
如果只是想以非阻塞的状态打开waitingForm,那只要用waitingForm.Show(),就可以了。希望能解决你的问题。
刚才在看你的问题的时候突然听到楼下一个女子在痛哭,到阳台上一看,一群男人围着她拳打脚踢,路上的出租车都停了下来准备干预,结果冲出一辆黑色轿车,把打那女子的人带走了,只留下她在马路上哭,应该是抢劫,真是一群畜牲!
------解决方案--------------------
我把你的程序改改你看能满足你的需求不。
WaitingForm waitingForm = new WaitingForm();
waitingForm.Show();
try
{
————————————
此处为其他业务代码
————————————
//openWaitingFormThread.Abort();单看你的代码看不出来非用多线程不可
waitingForm.Close();

}
catch(Exception e)
{
System.Windows.Forms.MessageBox.Show(e.Message);
}
finally
{
//TODO:防止业务代码中出现异常造成此线程无法关闭
}