2013-12-16 105 views
5

我有一個同步調用,我需要轉換爲異步,我使用異步/等待關鍵字,但這隻會返回一旦任務完成我需要做的就是返回結果到UI逐一。在ASP.NET MVC中的異步操作4

該場景是我有一個任務列表顯示給用戶,一旦他們已經過身份驗證但是我希望一旦從數據庫中檢索到任務,一次加載一個任務,這裏是我的actionResult,它將搜索條件預過濾器的任務:

public async Task<ActionResult> Index(string searchTerm = null, int page = 1) 
{ 
    Shared.InitialiseCriteria(SearchCriteria); 
    SearchCriteria.DepartmentID = DepartmentID; 
    SearchCriteria.PageSize = 15; 
    SearchCriteria.FreeText = searchTerm; 

    var model = await DoStuff(SearchCriteria); 

     if (Request.IsAjaxRequest()) 
     { 
      return PartialView("_ConversationList", model); 
     } 
    return View(model); 

} 

這裏是AWAIT任務這就要求GetConversation基本上得到任務時,首要的任務就是找到我需要它被裝載到索引視圖:

private async Task<Result> DoStuff(CSearchCriteria SearchCriteria) 
{ 

    return GetConversations(SearchCriteria); 
} 
+0

你能進一步解釋究竟你希望發生的,到底發生了什麼? – sinelaw

+0

我希望在數據庫中找到的任務可以逐個加載到局部視圖中,這樣用戶就不會在加載屏幕上出現,此時只需要加載四個任務大約需要10秒。如果需要,我可以提供更多信息... – user2711252

回答

4

唯一的目的是ASP.NET MVC中的異步控制器是在異步操作正在進行時釋放IIS線程來管理一些其他請求。從呼叫者的角度來看,它就像使用同步控制器一樣。

所以,我不認爲你可以用異步控制器實現你想要的(你可以使用它,但它不會解決你的問題)。

我認爲你可以在服務器端實現某種分頁來檢索部分數據並通過SignalR發送給客戶端。

+0

+1。我有一篇博客文章解釋說['async'不會更改HTTP協議](http://blog.stephencleary.com/2012/08/async-doesnt-change-http-protocol.html)。 –

+0

@Alex感謝您的回覆,您能否提供建議我如何才能實現理想的結果我也嘗試了線程化,但不確定如何在從數據庫中檢索到第一個任務後刷新/更新索引視圖。 – user2711252

+0

我已經用我的意見更新了一個答案如何去做。 –

0

有幾個問題在這裏:

  • 如何以事業爲每個項目提供ASP.NET儘快開始返回數據,
  • 如何協調客戶&服務器,從而使客戶知道一個新的項目可用(即,因此它可以在響應分別解析每一個項目,或因此它可以請求更多的數據,如果你正在尋找「拉」)

正如AlexK的答案解釋, async api doe不會改變服務器響應客戶端的方式。異步只允許您的應用程序在不使用時釋放線程,並且使得依賴多個資源的部分請求並行化變得更加容易。

除了使用爲此設計的SignalR外,您還可以自己使用內置的低級別機制 - PushStreamContent。下面是關於如何做一對夫婦的博客文章: