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

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

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

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

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

谢谢,

山姆

【问题讨论】:

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

标签: c# asp.net-mvc asynchronous


【解决方案1】:

在客户端,您必须创建 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(()=&gt;{your code})

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

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