如何在mvc中启动任务,并在任务完成时发出通知

本文关键字:任务 完成时 发出通知 启动 mvc | 更新日期: 2023-09-27 17:58:30

我以前从未尝试过在mvc中运行异步任务,所以我不确定该朝哪个方向发展。

我有一个类,它从大量数据中生成excel文件,这可能需要一些时间。我希望这样,当用户点击链接时,他们会收到一条消息,说"完成后会通知你",任务开始,然后他们可以继续使用网络应用程序,一旦完成,他们就会收到屏幕上的通知,最好是通过ajax。可能有几个任务同时运行。如果我能看看任务是否还在运行,那就太好了。

这些任务从不安排,总是"随需应变"

哪种方法最适合这个?我见过有system.threading、signaler、quartz.net等,但有些可能太夸张了。

谢谢,

Sam

如何在mvc中启动任务,并在任务完成时发出通知

在客户端,您必须创建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){}
}

您可以将其放在ApplicationSession(每个用户会话一个实例)中。并使用它来回答轮询请求。

任务可以轻松创建Task.StartNew(MethodName)Task.StartNew(()=>{your code})

只需提及——还有另一种方法可以做到这一点——WebSockets。但这武器太重了。你可能不想要它。

脑海中浮现出两种可能性:AJAX或SignalR。第一种是天真的做法。启动一个任务,然后每隔一段时间使用AJAX调用来检查该任务是否已完成。缺点是您将向服务器发送大量请求。

第二种方法涉及使用SignalR,在现代浏览器中,SignalR可以使用WebSockets和向客户端推送通知。与AJAX轮询技术相反,使用SignalR,服务器可以通知客户端某些任务已经在服务器上进行或完成。它针对这些场景进行了更多的优化。就我个人而言,我建议您使用SignalR来完成此任务。