2016-03-08 46 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提供了一个更好的方法。 –

相关问题