7

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

4

4 回答 4

12

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

首先,通过 NuGet 安装包。如果您有任何问题,请参阅官方文档中的快速入门指南。

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相应地附加该方法。

于 2014-06-09T07:31:37.027 回答
5

.Net 4.5.2 添加了可用于安排任务的QueueBackgroundWorkItem 。如果您不控制服务器(重新启动时),appPool 关闭的 90 秒默认延迟将不起作用(除非您可以检测到任务未完成并在另一台服务器上运行它)。有关更多详细信息,请参阅“ QueueBackgroundWorkItem 以在 ASP.NET 中可靠地调度和运行后台进程

于 2014-06-06T04:45:15.620 回答
3

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

于 2012-10-23T20:44:12.493 回答
0

如果您控制服务器,并且需要像 Hangfire 这样的完整框架更简单,您可以制作控制台应用程序(.exe),并制作任何东西......然后您可以使用Process.Start方法调用 .exe,您可以从 SQL Server 调用 .exe 到服务等。

于 2018-11-12T22:06:40.580 回答