假设我有一个异步方法:
public async Task Do()
{
await Task.Delay(1000);
}
另一种方法是尝试调用Do
里面的方法catch
block
public async Task DoMore()
{
try
{
}
catch (Exception)
{
await Do(); //compiled error.
}
}
但这样一来,编译器就不允许使用await
inside catch
,幕后是否有任何原因导致我们不能以这种方式使用它?
Update
这将在 C# 6 中得到支持。事实证明,这从根本上来说并不是不可能的,并且团队在不疯狂实施的情况下找到了如何做到这一点:)
原答案
我强烈怀疑这是一样的推理阻止yield return避免在 catch 块中使用 http://blogs.msdn.com/b/ericlippert/archive/2009/07/20/iterator-blocks-part-four-why-no-yield-in-catch.aspx.
尤其:
首先,我们仍然存在这样的问题:“转到”受 try 保护的区域的处理程序的中间是非法的。进入 catch 块的唯一方法是通过捕获异常的“非本地 goto”。因此,一旦退出 catch 块,下次调用 MoveNext 时,我们将无法返回到我们停止的地方。
其次,抛出和捕获的异常是 catch 块执行的固有部分,因为它可以使用“空抛出”语法重新抛出。我们无法在调用 MoveNext 时保留该状态。
将“yield”替换为“await”,我想你就会得到答案。
感觉这会是一件奇怪的事情want在大多数情况下要做,你应该usually能够相当容易地重写您的代码以等待之后catch
阻止 - 当然,除非你试图等待某些东西然后抛出。那样的话,我承认会有点痛苦……
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)