假设以下代码在单独的线程中运行:

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中, ThreadAbortExceptioncatchfinally块中以特殊方式处理:

  • 如果捕获到ThreadAbortException,它将在catch块的末尾自动重新引发(除非被Thread.ResetAbort抑制)
  • finally块中,直到整个块的结尾都不会“激活” ThreadAbortException。这是预期的行为。这就是为什么您有时会在try {}部分中找到带有空finally块的obscure codes的原因。它保证此部分不会被中止。

  • 另一方面, .NET Core 不支持Thread.Abort(引发PlatformNotSupportedException)。 ThreadAbortException本身尚未删除(出于兼容性原因),因此您仍然可以显式抛出它,但我认为仍然不能如上所述处理它(我没有对其进行测试)。

    09-25 20:38