为什么在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
但如果我做出这些改变中的任何一个……
- 取消注释行A(并删除对Main中的
Thread.ResetAbort()
的调用 – 另一个奇怪的) - 更改第B行以
throw new Exception();
- 删除C行
那么输出就是
catch finally
这种行为是一个错误,还是设计(并在某处记录)?
注意:在我的实际场景(ASP.NET应用程序)中,HttpResponse.Redirect抛出ThreadAbortException,并且我在finally块中执行异步I / O.