.net 4.5,asp.net MVC:从ASP.NET应用程序中运行持久过程(1-2分钟)的最佳方法是什么 - 线程环境,我的意思是,该过程仅一次是为一个用户启动的,所有其他用户的执行必须等到当前执行完成?场景是以下:用户单击按钮运行某种长期计算,HTTP响应立即返回给用户,然后用户必须手动请求单独的请求请求计算状态。ASP.NET HTTP会话堕胎不应导致过程终止,它应该继续进行。该过程可能在同一服务器或单独的服务器上运行。
我将向您展示如何使用http://hangfire.io执行此任务 - 在ASP.NET应用程序中执行fire-and-forget,延迟和重复的任务非常简单的方法。无需Windows服务。
首先,通过Nuget安装软件包。如果您有任何问题,请参阅官方文档中的快速启动指南。
PM> Install-Package Hangfire
打开您的OWIN启动类并添加以下行:
public void Configure(IAppBuilder app)
{
GlobalConfiguration.Configuration.UseSqlServerStorage("connection_string");
app.UseHangfireDashboard();
app.UseHangfireServer();
}
然后编写将完成长期工作的方法(我应用属性一次仅执行一种方法):
[DisableConcurrentExecution]
public void LongRunning()
{
// Some processing stuff
}
,然后在后台将方法称为fire and-forget以立即响应用户:
public ActionResult Perform()
{
BackgroundJob.Enqueue(() => LongRunning());
return View();
}
如果要通知用户有关工作完成的通知,请考虑使用SignalR并相应地附加LongRunning
方法。
.net 4.5.2添加了QueueBackgroundWorkitem,您可以用来安排任务。如果您不控制服务器(重新启动时),则AppPool关闭的90秒默认延迟将无法正常工作(除非您可以检测到任务未完成并在另一台服务器上运行)。有关更多详细信息,请参见" QueueBackgroundWorkitem,以可靠的时间表并在ASP.NET中运行背景过程"
我建议使用诸如nservicebus之类的产品卸载处理并以单线螺纹模式运行。这样做的好处是,所有请求都将按顺序进行处理,并且可以从Web服务器上卸载处理,因为您实际上并不希望在Web服务器上进行长时间的运行过程。
如果您控制了服务器,并且需要更简单的性能,那么完整的框架像hangfire一样,可以制作控制台应用程序(.exe),然后做任何事情...,那么您可以使用process.start方法调用.exe,您可以将.EXE从SQL Server致电。