如何在mvc中启动任务并在任务完成时收到通知?
我从来没有尝试过在mvc中运行异步任务,所以我不确定哪个方向。如何在mvc中启动任务并在任务完成时收到通知?
我有一个类可以从很多数据生成一个excel文件,这可能需要一些时间。我想要它,所以当用户点击一个链接时,他们会收到一条消息,提示“完成时会通知你”并开始任务,然后他们可以继续使用该网络应用程序,并且一旦出现这种情况,他们就会收到屏幕上的通知完成,最好通过ajax可能有几个任务在同一时间运行。如果我能看到任务是否仍在运行,那将是一件好事。
这些任务从来没有计划,始终坚持“按需”
哪种方法最适合呢?我见过有system.threading,signalr,quartz.net等,但有些可能会矫枉过正。
感谢,
山姆
2的可能性浮现在脑海中:AJAX或SignalR。首先是天真的方法。你开始一个任务,然后你会定期使用AJAX调用来检查这个任务是否完成。缺点是你会发送很多请求到你的服务器。
第二种方法涉及使用SignalR,在现代浏览器中可以使用WebSockets和Push通知给客户端。与AJAX轮询技术相反,在SignalR中,服务器可以通知客户端某些任务已在服务器上完成或完成。它对于那些场景更加优化。我个人建议你使用SignalR来完成这个任务。
谢谢,但我没有看到signalr如何让我开始一个后台任务,同时在Web应用程序中查看其他页面,我怎样才能让它在离开页面后运行任务? – 2013-02-10 23:39:07
在每个页面上,您应该有一个订阅SignalR的脚本,当任务完成时,服务器会将通知推送给所有订阅的客户端。 – 2013-02-11 08:00:08
我们可以通知一个特定的用户吗? – 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){}
}
您可以将其放入Application
或Session
(每个用户会话一个实例)。 并用它来回答投票请求。
任务可以轻松创建Task.StartNew(MethodName)
或Task.StartNew(()=>{your code})
仅举 - 有这样做的另一种方式 - 的WebSockets。但它太重了。你可能不想要它。
用户可以离开他们开始执行任务的页面,并在任务完成时在另一个页面上获得确认吗?或者他们会留在同一页面上?第一个实现起来相当具有挑战性,而AJAX请求可能是完成第二个任务所需的全部。 – 2013-02-10 22:28:37
另一个页面,如果有一种方法来检查任务是否完成在C#我可以写一个web服务使用ajax返回一个计时器上的真或假 – 2013-02-10 22:33:31
我可以想到2种可能性:标准AJAX定期轮询和SignalR。 – 2013-02-10 22:37:25