如何在asp.net下异步运行持久的进程?

时间:2012-10-23 20:34:37

标签: c# asp.net .net long-running-processes

.net 4.5,asp.net mvc:从ASP.NET应用程序运行持久进程(1-2分钟)的最佳方法是什么,它应该在单线程环境中运行,我的意思是过程仅为一个用户启动,所有其他用户的执行必须等到当前执行完毕?方案如下:用户单击按钮运行某种持久计算,http响应立即返回给用户,然后用户必须手动请求单独请求的计算状态。 Asp.net http会话流产不应该导致流程终止,它应该继续下去。该过程可以在相同或不同的服务器上运行。

4 个答案:

答案 0 :(得分:12)

我将向您展示如何使用http://hangfire.io执行此任务 - 这是一种非常简单的方法,可以在ASP.NET应用程序中执行“即发即弃”,“延迟”和“重复”任务。无需Windows服务。

首先,通过NuGet安装软件包。如果您有任何问题,请参阅官方文档中的Quick Start指南。

PM> Install-Package Hangfire

打开您的OWIN Startup类并添加以下行:

public void Configure(IAppBuilder app)
{
    GlobalConfiguration.Configuration.UseSqlServerStorage("connection_string");

    app.UseHangfireDashboard();
    app.UseHangfireServer();
}

然后编写将执行长期工作的方法(我应用属性一次只执行一个方法):

[DisableConcurrentExecution]
public void LongRunning()
{
    // Some processing stuff
}

然后在后台调用一个方法,即时响应用户:

public ActionResult Perform()
{
    BackgroundJob.Enqueue(() => LongRunning());
    return View();
}

如果您想通知用户有关工作完成情况,请考虑使用SignalR并相应地附加LongRunning方法。

答案 1 :(得分:4)

.Net 4.5.2添加了QueueBackgroundWorkItem,您可以使用它来安排任务。如果您不控制服务器(当它重新启动时),appPool关闭的90秒默认延迟将无法正常工作(除非您可以检测到任务没有完成并运行它在另一台服务器上)。有关详细信息,请参阅" QueueBackgroundWorkItem to reliably schedule and run background processes in ASP.NET"

答案 2 :(得分:3)

我建议使用NServiceBus等产品卸载处理并以单线程模式运行。这样做的好处是所有请求都将按顺序处理,并且可以从Web服务器卸载处理,因为您不希望在Web服务器上发生长时间运行的进程。

答案 3 :(得分:0)

如果您控制服务器,并且需要更简单的功能(例如Hangfire等完整的框架),则可以制作一个控制台应用(.exe),然后进行任何操作...,然后可以使用{{3 }}方法,您可以从SQL Server调用.exe来进行服务等。