如何在 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)
您可以将其放入Application
或Session
(每个用户会话一个实例)。
并用它来回答投票请求。
可以轻松创建任务Task.StartNew(MethodName)
或Task.StartNew(()=>your code)
顺便提一下——还有另一种方法——WebSockets。但它的武器太重了。你可能不想要它。
【讨论】:
【参考方案2】:想到了 2 种可能性:AJAX 或 SignalR。第一种是天真的方法。你开始一个任务,然后你会定期使用 AJAX 调用来检查这个任务是否已经完成。缺点是您将向服务器发送大量请求。
第二种方法涉及使用 SignalR,它在现代浏览器中可以使用 WebSocket 并将通知推送到客户端。与 AJAX 轮询技术相反,使用 SignalR,服务器可以通知客户端某些任务已在服务器上进行或完成。它针对这些场景进行了更多优化。我个人建议您使用 SignalR 来完成这项任务。
【讨论】:
谢谢,但我看不到 Signalr 如何让我在查看 Web 应用程序中的其他页面时启动后台任务,我怎样才能让它在离开页面后运行任务? 在每个页面上,您都应该有一个订阅 SignalR 的脚本,当任务完成时,服务器将向所有订阅的客户端推送通知。 我们可以只通知特定用户吗?以上是关于如何在 mvc 中启动任务并在任务完成时收到通知?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 SignalR 从 ASP.NET MVC 3 通知 Web 客户端 MSMQ 任务已完成