无法从调用异步方法的控制器返回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); 
} 
+0

是的,我可以改变它这样,但我确实需要到位的泛型方法,所以我可以传递任何类类型。我的问题是,有没有一种方法可以从GetData方法返回ActionResult,并且仍然是异步的,因为反正我不是'返回'等待数据,而是'View(model)'。我希望你在这里理解我的关注。 – Sam 2014-08-28 18:59:06

+0

您正在返回一个等待数据,因为'View(model)'依赖于'model','model'依赖于反序列化操作,这依赖于GetRequest异步结果。没有'GetRequest'的结果,就没有'model',因此没有'ActionResult'返回。 – mostruash 2014-08-28 19:02:49

+0

请参阅'GetData'必须等待'View(model)'被构造。这是等待的。我不知道如何解释这一点,除了await/async API之外,您还需要对异步操作有所了解。例如在Javascript中看到异步的东西。 – mostruash 2014-08-28 19:06:56