为什么在finally块中不允许等待?

时间:2013-02-01 12:43:15

标签: c# async-await c#-5.0

为什么await块中不允许finally

public async void Fn()
{
    try
    {
    }
    finally
    {
        await Task.Delay(4000);
    }
}

知道可以手动获取Awaiter

public void Fn()
{
    try
    {
    }
    finally
    {
        var awaiter = Task.Delay(4000).GetAwaiter();
     }
}

1 个答案:

答案 0 :(得分:13)

取自:Where can’t I use “await”?

  

在捕获或最终阻止内部。你可以在a里面使用“await”   尝试阻止,无论它是否有关联或最终   块,但你不能在catch或finally块中使用它。   这样做会破坏CLR异常处理的语义。

在C#6.0中显然不再适用

取自:A C# 6.0 Language Preview

  

C#6.0消除了这个缺陷,现在允许在catch和finally块中进行await调用(它们已经在try块中得到支持)