为什么在ThreadAbortException中有时*没有执行finally块*如果它包含await?

更新:我不认为这个问题是否可以重复, 最后可以跳过ThreadAbortException? 因为(1)我没有创建另一个线程,所以不存在竞争条件,(2)只有当finally块包含await时才会出现这种行为,而其他问题没有提及。


考虑这个控制台程序:

 class Program { static void Main() { try { T().GetAwaiter().GetResult(); } catch (ThreadAbortException) { Thread.ResetAbort(); } catch { } } static async Task Abort() { //await Task.Delay(1); // A Thread.CurrentThread.Abort(); // B } static async Task T() { try { await Abort(); } catch { Console.WriteLine("catch"); throw; } finally { Console.WriteLine("finally"); await Task.Yield(); // C } } } 

当我在Visual Studio 2015中编译它时,输出是

 catch 

但如果我做出这些改变中的任何一个……

  1. 取消注释行A(并删除对Main中的Thread.ResetAbort()的调用 – 另一个奇怪的)
  2. 更改第B行以throw new Exception();
  3. 删除C行

那么输出就是

 catch finally 

这种行为是一个错误,还是设计(并在某处记录)?

注意:在我的实际场景(ASP.NET应用程序)中,HttpResponse.Redirect抛出ThreadAbortException,并且我在finally块中执行异步I / O.