使用异步进行奇怪的try..catch行为

时间:2012-08-22 07:45:49

标签: c# asynchronous exception-handling

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

我来到下面的代码,令我惊讶,编译。任何人都能解释一下我的原因吗?

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

    }
}

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

2 个答案:

答案 0 :(得分:5)

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

所以代码的非异步版本就是:

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

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

代码无法编译:

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

    }
}

答案 1 :(得分:1)

在回答你对Jon的回答的问题时,我将这些链接添加为单独的答案,以便更好地阅读。

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

MSDN 2011年10月号:Parallel Programming with .NET

  1. Pause and Play with Await
  2. Async Performance: Understanding the Costs of Async and Await
  3. Easier Asynchronous Programming with the New Visual Studio Async CTP
  4. 特别是前两篇文章可能正是您所寻找的内容,因为它们更好地描述了编译器如何在内部重写代码以使async/ await工作。