2014-03-26 25 views
7

我正在編寫一個小型的內部Web應用程序。 我需要按下按鈕才能進行非常長的操作(可能需要大約一個小時),並在操作完成並結果後讓用戶知道。在MVC中使用異步操作更新視圖

換句話說,我需要該按鈕來啓動異步操作並刷新視圖並在結果完成後(約一小時後)結果。

編輯:操作可以在視圖中使用某種刷新機制。結果可以小滯後後發送到視圖(不必刷新實時)

+3

可能是你可以考慮在這種情況下的WebSockets實現(SignalR) –

+0

看看[異步等待](http://msdn.microsoft.com/en-us/library/hh191443.aspx),聽起來像它可能會做你想要的。 – markpsmith

+0

ASP.NET和IIS並未構建到如此長的操作。您應該將您的工作發佈到別處(Windows服務?)並完成頁面輪詢。 –

回答

-1

嗯,

我會努力完成工作時,創建標誌到服務器。 在MVC中,您可以創建TIMER obj,例如,如果服務器已完成工作,則每分鐘檢查一次,並在不阻止應用程序的新線程中啓動此計時器。

(對不起,對我的英文來說)。

0

正如評論建議,我建議你看看SignalR,這並不難實現。
您必須在您的網站上實施服務器,在完成長時間操作後向服務器發送消息,並在收到消息時刷新視圖。
微軟的教程應該足夠清楚。

3

你可以使用SignalR,但這可能有點矯枉過正。另一種選擇是設置另一個控制器動作,檢查任務是否已完成。然後,在客戶端,您可以使用jQuery向該控制器操作發出ajax請求。當動作完成後,您可以顯示警報或以其他方式更新頁面。

$.ajax({ 
    type: 'GET', 
    url: http://mysite.info/tasks/checkComplete/5, 
    success: function (response) { 
     if (response == 'true') { 
      alert('Task complete'); 
     }   
    } 
}); 

至於在服務器端發生了什麼,我不認爲這是我會使用async/await的情況。如果你的任務真的要運行一個小時,我有一種感覺,你會遇到超時問題,等等。我會有一個控制器動作,用於啓動任務,但它所做的只是將請求在數據庫中啓動。然後我會有一個外部的「工作人員」來檢查數據庫中的請求並執行任務。一旦任務完成,它將更新該數據庫條目以將其標記爲完整。然後,我上面的示例中的「CheckComplete」控制器操作可以檢查數據庫以查看任務是否實際完成。

0

AJAX和WebSockets之前的低端技術解決方案只是將數據連續寫入響應(通常是進度報告)。

因此,而不是做的工作異步的,你會打電話像

Response.Write("<script>reportProgress(" + progress + ");</script>"); 
Response.Flush(); 

曾經在一段時間。它有它的問題,但如果你必須支持奇怪的平臺或者非常老的瀏覽器,它仍然是一個好方法。