我有一个System.Timers.Timer
计时器,它AutoReset
设置为false
。我使用try/finally
来确保在计时器callback
结束时Start
计时器(我以这种方式使用计时器以防止callback
执行重叠)。法典:
// inside timer call back
try
{
// Do something
}
finally
{
timer.Start(); // Is this line always executed?
}
我的问题是如果执行线程Aborted
会发生什么?finally
部分是否仍在执行,或者没有线程来运行该部分?
来源...
当调用中止时 销毁线程的方法,常见的 语言运行时引发 线程中止异常。 ThreadAbortException 是一个特殊的 可以捕获的异常,但它 将自动在 捕获块的末尾。当这个 引发异常,运行时 执行之前的所有 finally 块 结束线程。因为线程 可以在 最后阻止或呼叫 Thread.ResetAbort 以取消中止, 不能保证线程 将永远结束。如果你想等待 直到中止的线程结束, 可以调用 Thread.Join 方法。 加入是阻止调用,不 返回,直到线程实际停止 执行。
在 MSDN 上阅读有关它的更多信息。
是的,该行将始终执行并阻止中止,直到 finally
子句中的代码完成。
引用文档(强调我的):
在线程上调用此方法时,系统会在线程中引发 ThreadAbortException 以中止它。ThreadAbortException 是一个特殊的异常,可以由应用程序代码捕获,但除非调用 ResetAbort,否则会在 catch 块的末尾重新引发。ResetAbort 取消中止请求,并防止 ThreadAbortException 终止线程。未执行的最终块在线程中止之前执行。
不保证线程立即中止或根本不中止。如果线程在作为中止过程的一部分调用的 finally 块中执行无限量的计算,从而无限期延迟中止,则可能会发生这种情况。若要等到线程中止,可以在调用 Abort 方法后在线程上调用 Join 方法,但不能保证等待会结束。
所以答案是肯定的,最终的块将被执行。
是的,无论 finally
如何从try
退出,都将始终使用它,
而 catch 用于处理语句块中发生的异常, finally 用于保证代码的语句块执行,无论 如何退出前面的尝试块。
在MSDN上阅读更多内容。
如果线程已经中止,catch 块和 finally 块可以继续执行。
请参考此链接以清楚地了解它在system.threading类中的处理方式探测线程中止异常的深度