2013-02-10 81 views
3

我從來沒有嘗試過在mvc中運行異步任務,所以我不確定哪個方向。如何在mvc中啓動任務並在任務完成時收到通知?

我有一個類可以從很多數據生成一個excel文件,這可能需要一些時間。我想要它,所以當用戶點擊一個鏈接時,他們會收到一條消息,提示「完成時會通知你」並開始任務,然後他們可以繼續使用該網絡應用程序,並且一旦出現這種情況,他們就會收到屏幕上的通知完成,最好通過ajax可能有幾個任務在同一時間運行。如果我能看到任務是否仍在運行,那將是一件好事。

這些任務從來沒有計劃,始終堅持「按需」

哪種方法最適合呢?我見過有system.threading,signalr,quartz.net等,但有些可能會矯枉過正。

感謝,

山姆

+1

用戶可以離開他們開始執行任務的頁面,並在任務完成時在另一個頁面上獲得確認嗎?或者他們會留在同一頁面上?第一個實現起來相當具有挑戰性,而AJAX請求可能是完成第二個任務所需的全部。 – 2013-02-10 22:28:37

+0

另一個頁面,如果有一種方法來檢查任務是否完成在C#我可以寫一個web服務使用ajax返回一個計時器上的真或假 – 2013-02-10 22:33:31

+0

我可以想到2種可能性:標準AJAX定期輪詢和SignalR。 – 2013-02-10 22:37:25

回答

3

2的可能性浮現在腦海中:AJAX或SignalR。首先是天真的方法。你開始一個任務,然後你會定期使用AJAX調用來檢查這個任務是否完成。缺點是你會發送很多請求到你的服務器。

第二種方法涉及使用SignalR,在現代瀏覽器中可以使用WebSockets和Push通知給客戶端。與AJAX輪詢技術相反,在SignalR中,服務器可以通知客戶端某些任務已在服務器上完成或完成。它對於那些場景更加優化。我個人建議你使用SignalR來完成這個任務。

+0

謝謝,但我沒有看到signalr如何讓我開始一個後臺任務,同時在Web應用程序中查看其他頁面,我怎樣才能讓它在離開頁面後運行任務? – 2013-02-10 23:39:07

+0

在每個頁面上,您應該有一個訂閱SignalR的腳本,當任務完成時,服務器會將通知推送給所有訂閱的客戶端。 – 2013-02-11 08:00:08

+0

我們可以通知一個特定的用戶嗎? – 2016-06-29 08:37:01

4

在客戶端,您將不得不創建JavaScript輪詢代碼。
像這樣:

(function poll(){ 
    setTimeout(function(){ 
     $.ajax({ url: "server/checkStatus", success: function(data){ 
     // check notification data and react accordingly 
     }, dataType: "json"}); 
    }, 30000); 
})(); 

參見:

在服務器端創建對象的實例是這樣的(簡化):

class MyTasks 
{ 
    Dictionary<int, Task> tasks; 

    public bool AllTasksDone {get;} 
    public bool GetNumberOfRunnigTasksForUser(int userId){} 

    public void AddTask(int userId, Task task){} 
} 

您可以將其放入ApplicationSession(每個用戶會話一個實例)。 並用它來回答投票請求。

任務可以輕鬆創建Task.StartNew(MethodName)Task.StartNew(()=>{your code})

僅舉 - 有這樣做的另一種方式 - 的WebSockets。但它太重了。你可能不想要它。

相關問題