2012-12-03 80 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。簡而言之,有兩個原因:向後兼容性和代碼可讀性。