ThreadAbortException是否仍然强制执行finally(try / catch)部分中的代码?

时间:2011-05-23 15:29:16

标签: c# timer try-catch-finally threadabortexception

我有一个System.Timers.Timer计时器,AutoReset设置为false。我使用try/finally来确保Start计时器结束时callback(我以这种方式使用计时器来防止callback执行重叠。代码:

// inside timer call back
try
{
    // Do something
}
finally
{
    timer.Start(); // Is this line always executed?
}

我的问题是如果执行的线程是Aborted会发生什么? finally部分是否仍然执行或者没有线程来运行该部分?

5 个答案:

答案 0 :(得分:6)

官方消息来源......

  

拨打中止电话时   破坏线程的方法,常见的   语言运行时抛出一个   ThreadAbortException。   ThreadAbortException是一个特殊的   可以捕获的异常,但它   将自动再次提升   捕获块结束。当这个   引发异常,运行时   之前执行所有finally块   结束线程。因为线程   可以做一个无限的计算   最后阻止或打电话   Thread.ResetAbort取消中止,   没有保证线程   将永远结束。如果你想等   直到中止的线程结束,   你可以调用Thread.Join方法。   加入是一个阻止调用,但没有   返回直到线程实际停止   执行。

MSDN上了解详情。

答案 1 :(得分:4)

是的,该行将始终执行并且中止被阻止,直到finally子句中的代码完成。

答案 2 :(得分:4)

documentation(empahsis mine):

  

在线程上调用此方法时,系统会在线程中抛出ThreadAbortException以中止它。 ThreadAbortException是一个特殊的异常,可以被应用程序代码捕获,但是在catch块的末尾重新抛出,除非调用ResetAbort。 ResetAbort取消中止请求,并阻止ThreadAbortException终止线程。 在线程中止之前执行未执行的finally块。

     

不保证线程立即中止,或根本不中止。如果线程在作为中止过程的一部分调用的finally块中执行无限量计算,则会发生这种情况,从而无限期地延迟中止。要等到线程中止,可以在调用Abort方法后调用线程上的Join方法,但不能保证等待将结束。

所以答案是肯定的,将执行finally块。

答案 3 :(得分:1)

finally无论从try如何退出,

总是会被使用
 Whereas catch is used to handle exceptions that occur in a statement block, 
 finally is used to guarantee a statement block of code executes regardless 
 of how the preceding try block is exited.

MSDN上阅读更多内容。

答案 4 :(得分:1)

如果线程已经中止,则catch块和finally块可以继续执行。

请参阅此链接以获得有关如何在system.threading类中处理它的清晰图片 Plumbing the Depths of the ThreadAbortException