6

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

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

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

4

5 回答 5

7

官方来源...

当调用 Abort 方法来销毁线程时,公共语言运行时会引发 ThreadAbortException。ThreadAbortException 是一个可以被捕获的特殊异常,但它会在 catch 块结束时自动再次引发。当引发此异常时,运行时会在结束线程之前执行所有 finally 块。因为线程可以在 finally 块中进行无限计算或调用 Thread.ResetAbort 来取消中止,所以不能保证线程将永远结束。如果要等到中止的线程结束,可以调用 Thread.Join 方法。Join 是一个阻塞调用,直到线程真正停止执行才返回。

在MSDN上阅读有关它的更多信息。

于 2011-05-23T15:33:22.500 回答
4

Quoth文档(emahsis我的):

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

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

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

于 2011-05-23T15:33:15.960 回答
4

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

于 2011-05-23T15:32:29.387 回答
1

是的,finally无论它如何退出,都将始终使用它try

而 catch 用于处理语句块中发生的异常,
 finally 用于保证代码的语句块执行,无论
 前面的 try 块是如何退出的。

在MSDN上阅读更多内容。

于 2011-05-23T16:28:59.447 回答
1

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

请参考此链接以清楚地了解它在 system.threading 类中如何处理 Plumbing the Depths of the ThreadAbortException

于 2013-06-22T19:21:20.747 回答