为什么在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.
上述就是C#学习教程:为什么在ThreadAbortException中有时*没有执行finally块*如果它包含await?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/942974.html