我之前从未尝试过在mvc中运行异步任务,所以我不确定哪个方向。
我有一个类可以从很多数据中生成一个excel文件,这可能需要一些时间。我想要它,所以当用户点击链接时,他们会收到一条消息,说“完成后会收到通知”并且任务开始,然后他们可以继续使用网络应用程序,他们会在屏幕上收到通知完成,最好通过ajax可能会有一些任务同时运行。如果我能看到任务是否仍在运行,那将是一件好事。
这些任务从未按计划进行,始终是“按需”
哪种方法最适合这个?我见过那里有system.threading,signalr,quartz.net等等,但有些可能有点矫枉过正。
感谢,
萨姆
答案 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){}
}
您可以将其放在Application
或Session
中(每个用户会话一个实例)。
并用它来回答民意调查请求。
可以轻松创建任务Task.StartNew(MethodName)
或Task.StartNew(()=>{your code})
提一下 - 还有另一种方法 - WebSockets。但它太重武器了。你可能不想要它。
答案 1 :(得分:3)
有两种可能性:AJAX或SignalR。首先是天真的方法。您启动任务然后定期使用AJAX调用来检查此任务是否已完成。缺点是您将向服务器发送大量请求。
第二种方法涉及使用SignalR,在现代浏览器中可以使用WebSockets和Push通知客户端。与AJAX轮询技术相反,使用SignalR,服务器可以通知客户端某些任务已在服务器上升级或完成。它针对这些场景进行了更加优化。就个人而言,我建议您使用SignalR完成此任务。