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

Posted

技术标签:

【中文标题】如何在 mvc 中启动任务并在任务完成时收到通知?【英文标题】:How do i start a task in mvc and have a notification when the task is complete? 【发布时间】:2013-02-10 22:24:04 【问题描述】:

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

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

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

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

谢谢,

山姆

【问题讨论】:

用户是否可以离开他们开始任务的页面,但在任务完成后在另一个页面上得到确认?还是他们会停留在同一页面上?第一个可能很难实现,而 AJAX 请求可能是完成第二个所需的全部。 另一个页面,如果有办法在 c# 中检查任务是否完成,我可以编写一个 web 服务来使用 ajax 在计时器上返回真或假 我能想到 2 种可能性:标准 AJAX 定期轮询和 SignalR。 谢谢大家,我最终使用了一个包含Task.Factory.StartNew() 的Asynchronous Controller,并且目前有一个ajax 调用轮询来检查任务是否完成。它并不完美,所以一旦我开始工作,我会转到SignalR。 【参考方案1】:

在客户端,您必须创建 javascript 轮询代码。 像这样的:

(function poll()
   setTimeout(function()
      $.ajax( url: "server/checkStatus", success: function(data)
        // check notification data and react accordingly
      , dataType: "json");
  , 30000);
)();

另见:

How does facebook, gmail send the real time notification? Server polling with 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(()=&gt;your code)

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

谢谢,但我看不到 Signalr 如何让我在查看 Web 应用程序中的其他页面时启动后台任务,我怎样才能让它在离开页面后运行任务? 在每个页面上,您都应该有一个订阅 SignalR 的脚本,当任务完成时,服务器将向所有订阅的客户端推送通知。 我们可以只通知特定用户吗?

以上是关于如何在 mvc 中启动任务并在任务完成时收到通知?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SignalR 从 ASP.NET MVC 3 通知 Web 客户端 MSMQ 任务已完成

如何使用 AFNetworking 3.0 在后台下载大文件并在会话完成所有任务时显示本地通知

如何检查一个任务是不是完成并开始下一个?

当特定计划任务无法运行时如何发送电子邮件

如何在 Android 中的活动/任务更改时收到通知

如何在 c# 中运行多个任务并在完成这些任务时获取事件?