2012-12-03 52 views
7

可能重复:
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时,调用线程将被挂起并等待任务完成。因此,一旦await正在使用中,该方法不再是异步方法。对?

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

回答

2

一个巨大的洞察力量如何异步和等待工作的内部,看看乔恩斯基特的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走过一个步骤一步例如约的方式沿页面向下1/3:

4

async关键字的整个点是使await关键字。

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