如何在mvc中启动任务并在任务完成时收到通知?

如何在mvc中启动任务并在任务完成时收到通知?

问题描述:

我从来没有尝试过在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

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

在客户端,您将不得不创建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。但它太重了。你可能不想要它。