【问题标题】:How to run long-lasting process asynchronously under asp.net?如何在asp.net下异步运行持久的进程?
【发布时间】:2012-10-23 20:34:36
【问题描述】:

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

【问题讨论】:

  • 可以在电脑上加个服务吗?
  • 可以,但我想知道如何为每个网络应用线程提供连续执行?

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


【解决方案1】:

我将向您展示如何使用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 方法。

【讨论】:

  • 任何使用 SignalR 通知的完整示例?
【解决方案2】:

.Net 4.5.2 添加了QueueBackgroundWorkItem,您可以使用它来安排任务。如果您不控制服务器(重新启动时),则 appPool 关闭的 90 秒默认延迟将不起作用(除非您可以检测到任务未完成并在另一台服务器上运行)。更多详情见“QueueBackgroundWorkItem to reliably schedule and run background processes in ASP.NET

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 我们实际上正在考虑这个选项。有您提到的优点,但也有缺点以及必要的基础架构设置:MSMQ、消息队列创建、单独配置
    • NServiceBus 将为您处理很多事情(MSMQ 和 DTC 的安装和配置),它旨在解决您提到的问题。
    • 我喜欢 NSBus,可能它对我们来说是最好的解决方案,但我的意思是这样的解决方案会有一些额外的管理成本:1)MSMQ、RavenDb,也许还有其他需要要安装,我记得我们必须单独下载和设置它们,它们不是 NSBus 包的一部分,2) 有人需要定期检查失败的消息队列,除了我们的常规日志文件(两个应用程序跟踪点而不是一个)3 ) 单独的进程意味着它假设有自己的配置(两个配置文件来管理而不是一个)
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2021-06-23
      • 1970-01-01
      • 1970-01-01
      • 2013-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-21
      • 2021-12-12
      相关资源
      最近更新 更多