2013-07-28 28 views
0

我試圖在異步控制器中進行異步操作。我所需要做的就是當我在視圖中按下按鈕時,它會給我一個提醒,表明工作已完成。當工作完成時,我可以做一些事情(例如,返回一個JSON或重定向到另一個視圖)。這裏是我的代碼:MVC中的異步操作不起作用

服務器端:

public void DoWork() 
    { 
     var a = MakeADelay(); 
    } 

    public async Task<ActionResult> MakeADelay() 
    { 
     await Task.Delay(5000); 
     return RedirectToAction("UploadComplete"); 
    } 

    public ActionResult UploadComplete() 
    { 
     return View(); 
    } 

,這是我的客戶端代碼:

 $("#btnAsync").click(function() { 
     $.ajax({ 
      url: '/Upload/DoWork', 
      type: "post", 
      success: function() { 
       alert("Work in Progress!!"); 
      } 
     }); 
    }); 

運行此代碼時一切似乎都按預期執行,但在服務器端代碼達到聲明return RedirectToAction("UploadComplete");它什麼都沒做!我認爲它運行在另一個線程或其他東西。

是什麼問題?

第二個問題是異步操作究竟意味着什麼?我從不希望我的行動等待陳述完成。我總是希望我的行爲將作業發送到執行隊列並返回給客戶端,並且當作業完成後,我可以通過某種方式通知客戶端。我怎樣才能通知客戶?與SignalR或什麼?

+0

您是否有UploadComplete()Action的視圖。你怎麼說redirecttoactino什麼都不做? – ckv

+0

當然,我有一個對應於我的重定向語句的視圖。但是當它運行時不會發生重定向!你可以試試這個,讓我知道是否爲你運行。事實上,我的UploadComplete()方法從未得到執行。斷點從未擊中。 – Pouyan

+0

對不起,我不熟悉asyc等待的部分。所以我可能對你沒有幫助。 – ckv

回答

1

是什麼問題?

它在這裏:

public void DoWork() 
{ 
    var a = MakeADelay(); 
} 

這樣做是開始MakeADelay,然後立即返回到它的調用者,這大概完成創建響應,並將其發送。

延遲完成後,您的MakeADelay將嘗試通過調用RedirectToAction繼續執行。但是,該請求的響應已經發送,所以這很可能會導致異常(由於您從未await任務a將被忽略)。或者,也許它只是不會做任何事情,但它肯定不會不會做的是回到過去,並重寫已發送的響應。

第二個問題是異步操作究竟意味着什麼?

我有一個introduction on the subject,你可能會覺得有用。我還在我的博客上描述了async does not change the HTTP protocol - 對於每個請求,您仍然只能得到一個響應。你試圖做的是發送兩個響應一個請求,這是行不通的。

我總是希望我的操作將作業發送到執行隊列並返回給客戶端,當作業完成後,我可以通過某種方式通知客戶端。我怎樣才能通知客戶?與SignalR或什麼?

然後你需要一個隊列。我推薦一些具有持續性保證的進程。例如,Azure隊列,MSMQ,WebSphere MQ等。

而且,是的,您可以使用SignalR進行通知。我建議。

+0

謝謝史蒂芬,你是最好的異步的東西。這正是我正在等待的答案 – Pouyan