异步方法的返回类型必须为void,Task或Task <t>

时间:2016-03-08 21:27:15

标签: c# asynchronous async-await task-parallel-library task

我在这里有以下代码:

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 并获取包含结果的任务。

目前,它会出现编译错误

  

异步方法的返回类型必须为void,Task或Task

实现此目标并摆脱此错误的最佳方法是什么?其他(更好的解决方案)受到欢迎,并且对于为什么 task.Result.Result 在最后的 ContinueWith 中的一些解释也受到欢迎。

2 个答案:

答案 0 :(得分:14)

将返回类型更改为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;

答案 1 :(得分:9)

如错误中所述:

  

异步方法的返回类型必须是voidTaskTask<T>

在您的情况下,Task<T>或具体为Task<Dictionary<string, float>>。因此,您的方法需要声明为:

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

请注意,您实际上不需要返回Task<T>,只需要返回T。您可以阅读更多相关信息here