无法从调用异步方法的控制器返回ActionResult
问题描述:
我正在研究一个示例应用程序来查询api,我试图将通用块移动到查询并同时返回任务的QueryAsync。该函数将从控制器动作GetData中调用,它可以返回任务。在这里,我正在等待从QueryAsync中检索结果。我觉得它不是必需的,因为QueryAsync没有返回一个等待对象。但是如果我不这样做,我将无法从GetData控制器返回ActionResult。我的思想和实施是否正确?对不起,但我是使用MVC异步的新手。无法从调用异步方法的控制器返回ActionResult
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);
}
答
您正在返回从QueryAsync
的awaitable Task
,这是一个Task
是“异步”运行GetRequest
,然后同步反序列化的结果,并返回一个ActionResult
。把这些行动看作一个整体,挤进一个等待的任务。
从异步/等待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);
}
是的,我可以改变它这样,但我确实需要到位的泛型方法,所以我可以传递任何类类型。我的问题是,有没有一种方法可以从GetData方法返回ActionResult,并且仍然是异步的,因为反正我不是'返回'等待数据,而是'View(model)'。我希望你在这里理解我的关注。 – Sam 2014-08-28 18:59:06
您正在返回一个等待数据,因为'View(model)'依赖于'model','model'依赖于反序列化操作,这依赖于GetRequest异步结果。没有'GetRequest'的结果,就没有'model',因此没有'ActionResult'返回。 – mostruash 2014-08-28 19:02:49
请参阅'GetData'必须等待'View(model)'被构造。这是等待的。我不知道如何解释这一点,除了await/async API之外,您还需要对异步操作有所了解。例如在Javascript中看到异步的东西。 – mostruash 2014-08-28 19:06:56