ThreadAbortException 是否仍然强制执行finally(try/catch)部分中的代码?
-
09-09-2020 - |
题
我有一个 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
部分仍在执行或没有线程来运行该部分?
解决方案
是的,该行将始终被执行并且中止被阻止,直到 finally
条款结束。
其他提示
官方消息来源...
当对流产方法呼叫以破坏线程时,通用语言运行时会抛出ThreadAbortException。threadabortexception是一个特殊的例外,可以捕获,但会在捕获块末端再次自动提出。当提出此例外时,运行时将执行所有最后的阻止,然后再结束线程。由于线程可以在最后块或呼叫线程中进行无限的计算。要取消中止的restabort,因此无法保证该线程将永远结束。如果要等到中止线程结束,则可以调用线程。JOIN是一个阻止调用,直到线程实际停止执行之前,它才会返回。
阅读更多相关信息 微软软件定义网络.
引用 文档 (强调我的):
当在线程上调用此方法时,系统会在线程中抛出 ThreadAbortException 来中止该线程。ThreadAbortException 是一种特殊异常,可以由应用程序代码捕获,但除非调用 ResetAbort,否则会在 catch 块末尾重新引发。ResetAbort 取消中止请求,并防止 ThreadAbortException 终止线程。 未执行的finally 块在线程中止之前执行。
不保证线程立即中止或根本中止。如果线程执行以下操作,就会发生这种情况 作为中止过程的一部分调用的 finally 块中的计算量不受限制, ,从而无限期地延迟中止。要等到线程中止,可以在调用 Abort 方法后调用该线程的 Join 方法,但不能保证等待会结束。
所以答案是肯定的,finally 块将被执行。
是的 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.
阅读更多内容 微软软件定义网络.
如果线程已经被中止,则catch块和finally块可以继续执行。
请参考此链接以清楚地了解它在 system.threading 类中的处理方式深入探究 ThreadAbortException