10

可能重复:
为什么存在 async 关键字

我有两种方法。一种是普通方法(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' 运算符只能在异步方法中使用。考虑使用“异步”修饰符标记此方法并将其返回类型更改为“任务”。

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

备注:我知道我应该把逻辑MyMethodMyMethodAsync调用MyMethod来实现我想要的。

4

2 回答 2

4

关键字的全部意义async在于启用await关键字。

我收集了一些“为什么关键字会这样工作?” 我的博客上的问题。“为什么不能通过存在async来推断await?”的问题 Eric Lippert 在他的博客上给出了结论性的回答。简而言之,有两个原因:向后兼容性和代码可读性。

于 2012-12-03T01:45:18.833 回答
2

有关 async 和 await 如何在内部工作的大量见解,请查看 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 表达式或语句。该方法同步运行,直到它到达第一个等待表达式,此时它被挂起,直到等待的任务完成。同时,控制权返回给方法的调用者。如果该方法不包含等待表达式或语句,则它会同步执行。

最后,这篇 MSDN 文章: http: //msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx逐步介绍了一个示例,大约在页面下方的 1/3 处:

于 2012-12-03T00:55:15.443 回答