在thread.Abort()??
之后会发生什么说我有:
Thread mWorker = new Thread(new ThreadStart(this.run));
..
mWorker.Start();
**where**
private void run()
{
Logger.d(TAG, "run()");
...
try {
while (this.mRunning){
...
}
} catch (ThreadAbortException tae){
Logger.e(TAG,"some msg", tae);
this.doSomething();
} catch (IOException ioe){
Logger.e(TAG,"some msg", ioe);
this.doSomething();
} catch (Exception e){
Logger.e(TAG,"some msg", e);
this.doSomething();
} finally {
gracefoulyClose();
}
Logger.d(TAG, "run() - ended");
}
线程更复杂..但这里显示的是必要条件。那么当Abort()被调用时会发生什么?我的捕获工作会继续调用doSomething()吗?
因为我仍在控制台收到:
A first chance exception of type 'System.Threading.ThreadAbortException' occurred in mscorlib.dll
An exception of type 'System.Threading.ThreadAbortException' occurred in mscorlib.dll but was not handled in user code
但我确实有一个问题。不是吗??
答案 0 :(得分:7)
来自doc:
当调用Abort方法来销毁一个线程时, 公共语言运行库抛出ThreadAbortException。 ThreadAbortException是一个可以捕获的特殊异常,但它 将在catch块结束时再次自动引发。什么时候 引发此异常,运行时执行所有finally块 在结束帖子之前。因为线程可以做无界限 在finally块中计算或调用Thread.ResetAbort来取消 中止,无法保证线程永远不会结束。如果你 想要等到中止的线程结束,你可以调用 Thread.Join方法。加入是一个阻止调用,直到没有返回 线程实际上停止执行。
换句话说,在执行ThreadAbortException
的catch块之后,会重新引发异常,因此您的上一个记录器行(例如Logger.d(TAG, "run() - ended")
)永远不会执行。但由于this.doSoemthing
的调用位于ThreadAbortException
的catch块中,因此将执行。
另请注意,您的finally
阻止执行执行(请参阅上述文档)。
答案 1 :(得分:1)
如果您在代码response.redirect();
中使用某些位置,那么它将在内部使用
运行thread.abort();
所以它会抛出异常。相反,你可以使用Response.Redirect(url,false);
答案 2 :(得分:0)
您收到ThreadAbortException,因为在线程完成运行之前您的上下文正在退出。在退出之前,您需要等待线程完成。如果要退出,则需要确保线程可以接收程序希望结束的信号(并对其执行操作),然后管理程序执行的代码必须等待线程完成:
if (mThread != null && mThread.IsAlive) {
mThread.Join();
}
如果您担心线程永不退出,请使用带超时的重载,如果您点击计时器,则显式终止该线程。