2014-03-13 40 views
0

我有兩個異步方法如下:如何通過另一個返回異步任務?

protected async Task<bool> DoSomething(byte[] data) { 
    await System.Console.Out.WriteLineAsync("Do things."); 
    Data refinedData = Data.fromByteArray(data); 
    return DoSomething(refinedData); // Compiler error! 
} 

protected async Task<bool> DoSomething(Data data) { 
    /* Do way more interesting things with data now that it's our type! */ 
    return true; 
} 

我希望做的是沒有使用await我的第一個return語句,而是僅僅通過給DoSomething第二個覆蓋。有沒有一種特殊的方法,我可以調用返回的第二個覆蓋,以推遲生成的實例,或者我可以/應該使用的特定語言機制?

+0

我得到一個編譯錯誤說,第一種方法必須返回'bool'不'任務'。 –

+1

從第一個方法簽名中刪除async關鍵字,你應該沒問題。 –

+0

這是唯一的解決方案,還是有辦法解決這個問題,而不會失去在這些覆蓋類型中使用'await'的能力? –

回答

3

您應該從第一個方法簽名中刪除async關鍵字,或者您應該在返回之前使用await關鍵字。

return await DoSomething(refinedData);

+0

+1:確實 - 沒有'await' inside =>不標記方法'async'並且簡單地返回'任務';用'await'裏面的標記'async'和'return await ...'。 –

+0

這是正確的方法;當OP想象這個方法是否是異步時,不可能'傳遞',因爲表示'DoSomething(byte [])'異步方法調用的任務實際上是在方法的_first_ await中返回的,到應該設置爲任務完成結果的最終返回值。 –

+2

警告:從第一個方法的簽名中刪除'async'會改變它的行爲。具體來說,拋出的異常將不再被調用者期望的「任務」封裝起來。 –