无法从调用异步方法的控制器返回ActionResult

时间:2014-08-28 18:32:13

标签: asp.net-mvc asynchronous async-await

我正在研究一个示例app来查询api,我正在尝试将通用部分移动到QueryAsync中查询并返回Task。此函数将从控制器操作GetData调用,该操作也可以返回Task。在这里,我正在等待从QueryAsync中检索结果。我觉得这不是必需的,因为QueryAsync没有返回一个等待的对象。但是如果我不这样做,我将无法从GetData控制器返回ActionResult。我的思考和实施在这里是否正确?抱歉,我是新手使用Async和MVC。

private async Task<ActionResult> QueryAsync<T>(string url)
{
    Task<string> response_task = HttpClientService.HttpClientService.GetRequest(url);
    IEnumerable<T> model = JsonConvert.DeserializeObject<IEnumerable<T>>(await response_task);
    return View(model);
}

//
// GET: 
public async Task<ActionResult> GetData()
{
    string _address = "https://someurl";
    return await QueryAsync<ClassType>(_address);
}

1 个答案:

答案 0 :(得分:1)

您正在从Task返回一个等待QueryAsync的{​​{1}},这是Task&#34;异步&#34;运行GetRequest,然后同步反序列化结果并返回ActionResult。把这些操作想象成一个整体,挤进一个等待的任务。

从async / await API的角度来看,您的实现是正确的。您的实现等同于以下(忽略通用方法):

public async Task<ActionResult> GetData()
{
    var url = "https://someurl";
    var response = await HttpClientService.HttpClientService.GetRequest(url);
    var model = JsonConvert.DeserializeObject<IEnumerable<ClassType>>(response);
    return View(model);
}