为什么编译器不允许在catch块中使用await

时间:2012-10-14 06:41:54

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

假设我有一个异步方法:

public async Task Do()
{
    await Task.Delay(1000);
}

另一种方法是尝试在Do

中调用catch方法
public async Task DoMore()
{
    try
    {
    }
    catch (Exception)
    {
        await Do(); //compiled error.
    }
}

但是这样,编译器不允许在await内使用catch,为什么我们不能以这种方式使用它,是否有任何理由?

1 个答案:

答案 0 :(得分:14)

<强>更新

这将在C#6中得到支持。事实证明,这根本不可能,并且团队在不执行实施的情况下制定了如何做到这一点:)

原始回答

我强烈怀疑它是相同的reasoning that prevents yield return from being used in a catch block

特别是:

  

首先,我们仍然存在这样的问题:“转到”尝试保护区域的处理程序中间是非法的。进入catch块的唯一方法是通过捕获异常的“非本地goto”。因此,一旦你从catch块中退出,下次调用MoveNext时,我们就无法返回到我们离开的catch块。

     

其次,抛出和捕获的异常是catch块执行的固有部分,因为它可以使用“空抛出”语法重新抛出。我们无法通过调用MoveNext来保留该状态。

将“yield”替换为“等待”,我想你会得到答案。

感觉在大多数情况下想要做起来会很奇怪,而且通常能够轻松地重写代码以等待catch阻止 - 当然,除非你试图等待某事然后扔掉。在那种情况下,我承认会有点痛苦......