假设以下代码在单独的线程中运行:
try{
var stuffToDispose = new SomeClassThatNeedsDisposing();
//doing thing with stuffToDispose
}
finally{
if(stuffToDispose != null)
stuffToDispose.Dispose();
}
然后使用引发
ThreadAbortException
的机制中止该线程。可以在空检查和Dispose()之间发生ThreadAbortException
吗?又是,在最后一个街区的中间?finally{
if(stuffToDispose != null)
//This is where the Exception would strike
stuffToDispose.Dispose();
}
我很确定答案是否定的,但是其他人似乎相信这是可能的。
最佳答案
在 .NET Framework中, ThreadAbortException
在catch
和finally
块中以特殊方式处理:
ThreadAbortException
,它将在catch
块的末尾自动重新引发(除非被Thread.ResetAbort
抑制)finally
块中,直到整个块的结尾都不会“激活” ThreadAbortException
。这是预期的行为。这就是为什么您有时会在try {}
部分中找到带有空finally
块的obscure codes的原因。它保证此部分不会被中止。 另一方面, .NET Core 不支持
Thread.Abort
(引发PlatformNotSupportedException
)。 ThreadAbortException
本身尚未删除(出于兼容性原因),因此您仍然可以显式抛出它,但我认为仍然不能如上所述处理它(我没有对其进行测试)。