3

我开始使用 .NET 4.5,尤其是 async/await 功能。

我来到下面的代码,令我惊讶的是,它编译了。谁能解释我的原因?

async Task SomeMethod()
{
    try
    {
        await Task.Delay(1000);
    }
    catch
    {

    }
}

对于以前的 .NET 版本,编译器会抱怨类似以下的消息:“并非所有路径都返回值”。

4

2 回答 2

5

返回的异步方法Task等效于返回的普通方法void。这里没有特定于 try/catch 的内容 - 不要忘记您的try块也不会返回任何内容!

因此,您的代码的非异步版本将是:

void SomeMethod()
{
    try
    {
        Thread.Sleep(1000)
    }
    catch
    {
    }
}

...显然这会编译。(同样显然,使用 bare 很糟糕catch,但我认为这不是真正的问题:)

代码不会编译:

async Task<int> SomeMethod()
{
    try
    {
        await Task.Delay(1000);
        return 10;
    }
    catch
    {

    }
}
于 2012-08-22T07:47:43.703 回答
1

为了回答您对 Jon 的回答的问题,我将这些链接添加为单独的答案以提高可读性。

为了获得有关幕后发生的事情的更多信息,我想向您指出 MSDN 杂志中的这些文章,这些文章帮助我开始使用它:

MSDN 2011 年 10 月号:使用 .NET 进行并行编程

  1. 暂停和播放等待
  2. 异步性能:了解异步和等待的成本
  3. 使用新的 Visual Studio Async CTP 更轻松地进行异步编程

特别是前两篇文章可能是您正在寻找的,因为它们更好地描述了编译器如何在内部重写您的代码以使其async/ await工作。

于 2012-08-22T08:11:04.127 回答