2014-08-28 113 views
1

我正在研究一個示例應用程序來查詢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); 
} 

回答

1

您正在返回從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