我有两种方法。一种是常规方法(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
,该方法就不再是异步方法。正确?
备注:我知道我应该将逻辑放在MyMethod
和MyMethodAsync
调用MyMethod
中以实现我想要的目标。
答案 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遍历了一步一步的示例,大约是页面的三分之一: