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

时间:2013-02-10 22:24:04

标签: c# asp.net-mvc asynchronous

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

我有一个类可以从很多数据中生成一个excel文件,这可能需要一些时间。我想要它,所以当用户点击链接时,他们会收到一条消息,说“完成后会收到通知”并且任务开始,然后他们可以继续使用网络应用程序,他们会在屏幕上收到通知完成,最好通过ajax可能会有一些任务同时运行。如果我能看到任务是否仍在运行,那将是一件好事。

这些任务从未按计划进行,始终是“按需”

哪种方法最适合这个?我见过那里有system.threading,signalrquartz.net等等,但有些可能有点矫枉过正。

感谢,

萨姆

2 个答案:

答案 0 :(得分: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。但它太重武器了。你可能不想要它。

答案 1 :(得分:3)

有两种可能性:AJAX或SignalR。首先是天真的方法。您启动任务然后定期使用AJAX调用来检查此任务是否已完成。缺点是您将向服务器发送大量请求。

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