更新:我不认为这个问题与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
但如果我做出任何一项改变......
Thread.ResetAbort()
的调用 - 另一种奇怪的行为)throw new Exception();
然后输出
catch
finally
这种行为是一个错误,还是设计(并在某处记录)?
注意:在我的实际场景(ASP.NET应用程序)中,HttpResponse.Redirect抛出ThreadAbortException,并且我在finally块中执行异步I / O. / p>