4

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

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

这些任务从不安排,总是“按需”

哪种方法最适合这种情况?我已经看到有 system.threading、signalrquartz.net等,但有些可能是矫枉过正。

谢谢,

山姆

4

2 回答 2

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){}
}

您可以将其放入Application或放入Session(每个用户会话一个实例)。并用它来回答投票请求。

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

顺便提一下 - 还有另一种方法 - WebSockets。但它的武器太重了。你可能不想要它。

于 2013-02-10T22:37:57.320 回答
3

我想到了 2 种可能性:AJAX 或 SignalR。第一种是天真的方法。你开始一个任务,然后你会定期使用 AJAX 调用来检查这个任务是否已经完成。缺点是您将向服务器发送大量请求。

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

于 2013-02-10T22:36:08.053 回答