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



我有一个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类中的处理方式探测线程中止异常的深度

相关内容

  • 没有找到相关文章

最新更新