UPDATE:我不认为这个问题是重复的ThreadAbortException最后可以跳过吗? https://stackoverflow.com/questions/18002668/can-threadabortexception-skip-finally因为(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(并删除对
Thread.ResetAbort()
在主要——另一个奇怪的地方)
- 将 B 行更改为
throw new Exception();
- 删除C行
那么输出是
catch
finally
这种行为是一个错误,还是设计使然(并在某处记录)?
NOTE:在我的实际场景(ASP.NET 应用程序)中,ThreadAbortException 由 HttpResponse.Redirect 引发,并且我在 finally 块中执行异步 I/O。
None
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)