高手们!我的Thread.Abort()方法为什么有时会抛出ThreadAbortException异常,而有时不会?抛出后为什么?不能通过Try Catch捕获? Abort一定会抛出ThreadAbortException异常的,莫非你的线程执行体有问题? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 ThreadAbortException 类在对 Abort 方法进行调用时引发的异常。无法继承此类。备注在调用 Abort 方法以销毁线程时,公共语言运行库将引发 ThreadAbortException。ThreadAbortException 是一种可捕获的特殊异常,但在 catch 块的结尾处它将自动被再次引发。引发此异常时,运行库将在取消线程前执行所有 finally 块。由于线程可以在 finally 块中进行未绑定的计算,因此必须调用 Join 方法以保证线程已死亡。Join 是一个阻塞调用,它要到线程实际停止执行后才返回。ThreadAbortException 使用值为 0x80131530 的 HRESULT COR_E_THREADABORTED。 就是啊!Abort一定会抛出ThreadAbortException 的啊!而且可不可以这样啊?把catch(ThreadAbortException ex){ MessageBox.Show("ok"+ex.Message);}放到你的线程体里面? try:using System;using System.Threading;class Test{ static void Main(){ Thread t = new Thread(new ThreadStart(MyThreadWork)); Console.WriteLine("Start a thread..."); t.Start(); Thread.Sleep(10); Console.WriteLine("Abort it..."); t.Abort(); } static void MyThreadWork(){ try{ for(int i = 0; i <1000 ;i++) Console.WriteLine(i.ToString()); } catch(ThreadAbortException ex){ Console.WriteLine(ex.Message); //actually throw ThreadAbortException } }} 我觉得你的这两行代码放反了:MvThread.Abort();MvThread.Join();应该改为:MvThread.Join();MvThread.Abort();Join 是一个阻塞调用,它要到线程实际停止执行后才返回,也就是说等到你线程里面的所有操作全部完成后,你再来调用Abort()来关闭线程,这样就不会有错了,另外,即使在关闭的时候出现了异常,相信也肯定可以捕捉到异常的。当然如果你想同步或者异步来处理多线程间的数据传递那肯定不能用Join()了,:) 如何打开打印机属性对话框 如何修改datagridview中字体的颜色? 怎么去掉换行符就是不灵呀 C#获取盘的属性 获取这个盘是“本地硬盘”,“虚拟光驱”,还是“可移动盘” 怎样实现双击c#打包后生成的setup.exe后能自动安装vfpodbc.msi驱动? .net有没有所有素数的枚举 我想不是太难的问题! 请教:如何获取 datagrid(windows)单元格更改后的值 求教linq的使用方法 计算字符个数 请大家多多帮忙,关于arraylist的问题 在WEBFORM中怎样控制焦点
在对 Abort 方法进行调用时引发的异常。无法继承此类。
备注
在调用 Abort 方法以销毁线程时,公共语言运行库将引发 ThreadAbortException。ThreadAbortException 是一种可捕获的特殊异常,但在 catch 块的结尾处它将自动被再次引发。引发此异常时,运行库将在取消线程前执行所有 finally 块。由于线程可以在 finally 块中进行未绑定的计算,因此必须调用 Join 方法以保证线程已死亡。Join 是一个阻塞调用,它要到线程实际停止执行后才返回。ThreadAbortException 使用值为 0x80131530 的 HRESULT COR_E_THREADABORTED。
把
catch(ThreadAbortException ex)
{
MessageBox.Show("ok"+ex.Message);
}放到你的线程体里面?
using System.Threading;class Test{
static void Main(){
Thread t = new Thread(new ThreadStart(MyThreadWork));
Console.WriteLine("Start a thread...");
t.Start();
Thread.Sleep(10);
Console.WriteLine("Abort it...");
t.Abort();
}
static void MyThreadWork(){
try{
for(int i = 0; i <1000 ;i++)
Console.WriteLine(i.ToString());
}
catch(ThreadAbortException ex){
Console.WriteLine(ex.Message); //actually throw ThreadAbortException
}
}
}
MvThread.Abort();
MvThread.Join();
应该改为:
MvThread.Join();
MvThread.Abort();
Join 是一个阻塞调用,它要到线程实际停止执行后才返回,也就是说等到你线程里面的所有操作全部完成后,你再来调用Abort()来关闭线程,这样就不会有错了,另外,即使在关闭的时候出现了异常,相信也肯定可以捕捉到异常的。当然如果你想同步或者异步来处理多线程间的数据传递那肯定不能用Join()了,:)