2016-03-08 80 views
1

我有以下代碼在這裏:異步方法的返回類型必須爲void,任務或任務<T>

public async Dictionary<string, float> GetLikelihoodsAsync(List<string> inputs) 
{ 
    HttpClient client = new HttpClient(); 

    string uri = GetUri(); 
    string body = GetRequestBody(inputs); 
    byte[] requestData = Encoding.UTF8.GetBytes(body); 

    Dictionary<string, float> result = await GetResponseAsync(requestData, client, uri) 
     .ContinueWith(responseTask => ParseResponseAsync(responseTask.Result)) 
     .ContinueWith(task => task.Result.Result); 

    return result; 
} 

async Task<HttpResponseMessage> GetResponseAsync(byte[] requestData, HttpClient client, string uri) {...} 

async Task<Dictionary<string, float>> ParseResponseAsync(HttpResponseMessage response) {...} 

GetResponseAsync完成基本上,我想利用結果並將其提供給ParseResponseAsync,並獲取包含結果的任務。

目前,它提供了一個編譯器錯誤說

The return type of an async method must be void, Task or Task<T>  

什麼是實現這一目標,擺脫這種錯誤的最好方法?其他(更好的解決方案)的歡迎和一些解釋爲什麼task.Result.Result在最後ContinueWith也歡迎。

+0

如果是這樣,我會發布這個問題。 –

回答

7

更改返回類型Task<Dictionary<string, float>>

public async Task<Dictionary<string, float>> GetLikelihoodsAsync(List<string> inputs) 

你也可以更換的ContinueWith您的使用情況使用await

var response = await GetResponseAsync(requestData, client, uri); 
var result = await ParseResponseAsync(response); 
return result; 
+0

這兩個等待與ContinueWith具有相同的語義? –

+1

@TamasIonut他們正確地傳播異常,而不是隻是吞下它們。除此之外,它們是相同的。 – Servy

+0

@Servy那麼爲什麼要增加額外的ContinueWith API呢? –

8

正如錯誤陳述:

The return type of an async method must be void , Task or Task<T>

在你的情況下,將是Task<T>,或者特別是Task<Dictionary<string, float>>。所以,你的方法需要聲明爲這樣:

public async Task<Dictionary<string, float>> GetLikelihoodsAsync(List<string> inputs) 

注意,你實際上並不需要返回一個Task<T>,你只需要返回T。你可以閱讀更多關於它here

+0

感謝您的答覆,但前一個更完整一點,因爲它爲ContinueWith API提供了一個更好的方法。 –

相關問題