为什么必须“等待”在“异步”方法中?

时间:2012-12-03 00:46:46

标签: c# async-await

  

可能重复:
  Why does the async keyword exist

我有两种方法。一种是常规方法(MyMethod),一种是异步方法(MyMethodAsync)。我收到编译错误。

static string MyMethod()
{
    var result = await MyMethodAsync(); // compile error here
    return result;
}

async static Task<string> MyMethodAsync()
{
    /** perform my logic here... **/
    Thread.Sleep(1000);

    return "yes";
}

错误消息是

  

'await'运算符只能在异步方法中使用。考虑使用'async'修饰符标记此方法并将其返回类型更改为'Task'。

我很困惑。当我使用await关键字时,调用线程将被挂起并等待任务完成。因此,一旦使用await,该方法就不再是异步方法。正确?

备注:我知道我应该将逻辑放在MyMethodMyMethodAsync调用MyMethod中以实现我想要的目标。

2 个答案:

答案 0 :(得分:4)

async关键字的全部内容是启用await关键字。

我收集了一些“为什么这些关键字会以这种方式运作?”问题on my blog。问题“为什么async的存在不能推断await?”是answered conclusively by Eric Lippert on his blog。简而言之,有两个原因:向后兼容性和代码可读性。

答案 1 :(得分:2)

有关异步和等待内部工作的大量见解,请查看Jon Skeet的EduAsync博客系列:msmvps.com/blogs/jon_skeet/archive/tags/Eduasync/default.aspx

这篇MSDN文章也解释了它:http://msdn.microsoft.com/en-us/library/vstudio/hh156513.aspx

基本上:由async关键字修改的方法至少包含一个await表达式或语句。该方法同步运行,直到它到达第一个await表达式,此时它将被挂起,直到等待的任务完成。同时,控制权返回给方法的调用者。如果该方法不包含await表达式或语句,则它将同步执行。

最后,这篇MSDN文章:http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx遍历了一步一步的示例,大约是页面的三分之一: