我有一个 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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top