异步方法的返回类型必须是void、Task或Task<T>。

27

我这里有以下代码:

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<TResult>

如何实现这一目标并消除此错误?其他(更好的解决方案)也受欢迎,以及为什么在最后的 ContinueWith 中使用 task.Result.Result 的一些说明也很受欢迎。


如果是这样的话,我就会发出这个问题了。 - Tamas Ionut
2个回答

32

将返回类型更改为 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
@TamasIonut它们正确地传播异常,而不是仅仅吞噬它们。除此之外,它们是相同的。 - Servy
@Servy,那么为什么还要增加额外的ContinueWith API呢? - Tamas Ionut
@TamasIonut - Task类是在.net 4中添加的,与C#4发布同时。async/await是后来在C#5中添加的,有效地为编译器提供了一种为您编写续集的方法。 - Lee
@TamasIonut 1. 并非所有问题都可以使用 await 解决。尽管很少,有时需要它。2. 它比 await 早一个完整的语言版本。3. await 只是将代码重构为对 ContinueWith 的调用;必须存在它,因为这才使其正常工作。 - Servy
@TamasIonut 我从未遇到过想要取消或上下文行为的情况,这些情况不能使用async更轻松地实现,但我想某些人可能会遇到这种情况。通常,我看到它被用于添加微不足道的连续性,其中将代码提取到async方法中并不值得,即使它可以工作。 - Servy
显示剩余2条评论

13

正如错误所述:

异步方法的返回类型必须是 void, TaskTask<T>

在您的情况下,应该是 Task<T>,或者具体地说是 Task<Dictionary<string, float>>。 所以,您的方法需要声明为:

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

请注意,您实际上不需要返回一个Task<T>,只需要返回T。您可以在这里阅读更多信息。

谢谢您的回答,但是之前的那个更完整一些,因为它提供了更好的ContinueWith API的方式。 - Tamas Ionut

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接