为什么在ThreadAbortException中有时*不执行finally块*如果它包含await?

时间:2018-01-11 20:23:26

标签: c# .net async-await try-finally threadabortexception

更新:我不认为这个问题与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

但如果我做出任何一项改变......

  1. 取消注释A行(并删除对Main中Thread.ResetAbort()的调用 - 另一种奇怪的行为)
  2. 将第B行更改为throw new Exception();
  3. 删除第C行
  4. 然后输出

    catch
    finally
    

    这种行为是一个错误,还是设计(并在某处记录)?

    注意:在我的实际场景(ASP.NET应用程序)中,HttpResponse.Redirect抛出ThreadAbortException,并且我在finally块中执行异步I / O. / p>

0 个答案:

没有答案