Csharp/C#教程:为什么在ThreadAbortException中有时*没有执行finally块*如果它包含await?分享


为什么在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.

上述就是C#学习教程:为什么在ThreadAbortException中有时*没有执行finally块*如果它包含await?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/942974.html

(0)
上一篇 2021年11月13日
下一篇 2021年11月13日

精彩推荐