YMC*_*YMC 7 .net c# asp.net long-running-processes
.net 4.5,asp.net mvc:从ASP.NET应用程序运行持久进程(1-2分钟)的最佳方法是什么,它应该在单线程环境中运行,我的意思是该进程是为了一次只有一个用户,所有其他用户的执行必须等到当前执行完毕?方案如下:用户单击按钮运行某种持久计算,http响应立即返回给用户,然后用户必须手动请求单独请求的计算状态.Asp.net http会话流产不应该导致流程终止,它应该继续下去.该进程可以在相同或单独的服务器上运行.
odi*_*erj 12
我将向您展示如何使用http://hangfire.io执行此任务- 这是一种非常简单的方法,可以在ASP.NET应用程序中执行"即发即忘","延迟"和"重复"任务.无需Windows服务.
首先,通过NuGet安装包.如果您有任何问题,请参阅官方文档中的" 快速入门"指南.
PM> Install-Package Hangfire
Run Code Online (Sandbox Code Playgroud)
打开OWIN Startup类并添加以下行:
public void Configure(IAppBuilder app)
{
GlobalConfiguration.Configuration.UseSqlServerStorage("connection_string");
app.UseHangfireDashboard();
app.UseHangfireServer();
}
Run Code Online (Sandbox Code Playgroud)
然后编写将执行长时间运行的方法(我应用属性一次只执行一个方法):
[DisableConcurrentExecution]
public void LongRunning()
{
// Some processing stuff
}
Run Code Online (Sandbox Code Playgroud)
然后在后台调用一个方法,即时响应用户立即响应用户:
public ActionResult Perform()
{
BackgroundJob.Enqueue(() => LongRunning());
return View();
}
Run Code Online (Sandbox Code Playgroud)
如果要通知用户有关作业完成的信息,请考虑使用SignalR并LongRunning相应地附加方法.
.Net 4.5.2添加了可用于计划任务的QueueBackgroundWorkItem。如果您不控制服务器(重新启动服务器时),则appPool关闭的默认90秒延迟将不起作用(除非您可以检测到任务未完成并在另一台服务器上运行)。有关更多详细信息,请参见“ QueueBackgroundWorkItem以可靠地计划和运行ASP.NET中的后台进程 ”
我建议使用NServiceBus等产品来卸载处理并以单线程模式运行。这样做的优点是所有请求都将按顺序处理,并且处理可以从 Web 服务器上卸载,因为您确实不希望在 Web 服务器上发生长时间运行的进程。
| 归档时间: |
|
| 查看次数: |
4774 次 |
| 最近记录: |