在调查, 和 ThreadAbortException的问题时finally
,await
我遇到了另一个怪癖。根据文档:
ThreadAbortException 是一个可以被捕获的特殊异常,但它会在catch块结束时自动再次引发。
但是考虑这个控制台程序:
class Program
{
static void Main()
{
Run(false).GetAwaiter().GetResult();
Run(true).GetAwaiter().GetResult();
}
static async Task Run(bool yield)
{
Console.WriteLine(yield ? "With yielding" : "Without yielding");
try
{
try { await Abort(yield); }
catch (ThreadAbortException)
{
Console.WriteLine(" ThreadAbortException caught");
} // <-- ThreadAbortException should be automatically rethrown here
}
catch (ThreadAbortException)
{
Console.WriteLine(" Rethrown ThreadAbortException caught");
Thread.ResetAbort();
}
}
static async Task Abort(bool yield)
{
if (yield)
await Task.Yield();
Thread.CurrentThread.Abort();
}
}
当我在 Visual Studio 2015 中编译它时,输出是:
Without yielding
ThreadAbortException caught
Rethrown ThreadAbortException caught
With yielding
ThreadAbortException caught
因此,之后引发的 ThreadAbortExceptionTask.Yield()
不再被catch
块自动重新抛出!为什么是这样?