如何在mvc中启动任务,并在任务完成时发出通知
本文关键字:任务 完成时 发出通知 启动 mvc | 更新日期: 2023-09-27 17:58:30
我以前从未尝试过在mvc中运行异步任务,所以我不确定该朝哪个方向发展。
我有一个类,它从大量数据中生成excel文件,这可能需要一些时间。我希望这样,当用户点击链接时,他们会收到一条消息,说"完成后会通知你",任务开始,然后他们可以继续使用网络应用程序,一旦完成,他们就会收到屏幕上的通知,最好是通过ajax。可能有几个任务同时运行。如果我能看看任务是否还在运行,那就太好了。
这些任务从不安排,总是"随需应变"
哪种方法最适合这个?我见过有system.threading、signaler、quartz.net等,但有些可能太夸张了。
谢谢,
Sam
在客户端,您必须创建javascript轮询代码
类似这样的东西:
(function poll(){
setTimeout(function(){
$.ajax({ url: "server/checkStatus", success: function(data){
// check notification data and react accordingly
}, dataType: "json"});
}, 30000);
})();
另请参阅:
- 脸书、gmail是如何发送实时通知的
- 使用JavaScript的服务器轮询
在服务器端创建这样的对象实例(简化):
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或SignalR。第一种是天真的做法。启动一个任务,然后每隔一段时间使用AJAX调用来检查该任务是否已完成。缺点是您将向服务器发送大量请求。
第二种方法涉及使用SignalR,在现代浏览器中,SignalR可以使用WebSockets和向客户端推送通知。与AJAX轮询技术相反,使用SignalR,服务器可以通知客户端某些任务已经在服务器上进行或完成。它针对这些场景进行了更多的优化。就我个人而言,我建议您使用SignalR来完成此任务。