【发布时间】:2018-06-22 03:01:35
【问题描述】:
在调查an issue with finally, await, and ThreadAbortException 时,我遇到了另一个怪癖。根据documentation:
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
因此,Task.Yield() 之后引发的 ThreadAbortException 不再被 catch 块自动重新抛出!这是为什么呢?
【问题讨论】:
标签: c# .net async-await try-catch threadabortexception