我有一个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
部分是否仍然执行或者没有线程来运行该部分?
答案 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