【问题标题】:Concerns with long-running process on IIS对 IIS 上长时间运行的进程的担忧
【发布时间】:2012-12-06 15:03:36
【问题描述】:

担忧:

我已经阅读了描述 IIS 可以随时回收应用程序池的帖子/博客。这是否意味着(就 IIS 回收应用程序池而言)我调用长时间运行的同步或异步进程并不重要,因为 IIS 可以回收应用程序池并终止长时间运行的进程?如果是这种情况,有哪些常见途径可以确保不会发生这种情况?

示例

public Task<ActionResult> LongRunningProcessAsync(SubmitFileModel aModel)

    {
        return Task.Run( () => LongRunningProcess( aModel) );
    }

【问题讨论】:

    标签: asp.net-mvc iis asp.net-mvc-4 iis-7.5


    【解决方案1】:

    HostingEnvironment 有一个静态方法RegisterObject,它允许您将对象放置在应用程序的已注册对象列表中。

    According to Phil Haack...

    当 ASP.NET 拆除 AppDomain 时,它会首先尝试调用 所有注册对象上的停止方法....当 ASP.NET 调用此方法时,您的代码需要阻止此方法返回,直到您的工作完成。

    或者,您可以创建一个不由 IIS 托管的服务。

    【讨论】:

    • 正确!这正是我所需要的。
    【解决方案2】:

    如果是这种情况,有哪些常见途径可以确保不会发生这种情况?

    您的应用程序域将在回收过程中卸载,无论是否使用RegisterObject 方法。它只会给你的后台工作一些时间来完成(默认为 30 秒)。如果您有超过这个“一段时间”的长时间运行的作业,它将被中止,并且没有人会关心重新启动时自动重试。

    如果你想在你的 ASP.NET 应用程序中运行长时间运行的作业,想保持简单,忘记 ASP.NET/IIS 问题,请查看HangFire - 它使用持久存储(SQL Server 或 Redis ) 并对回收过程具有免疫力。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-01
      • 2012-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-18
      • 2015-02-14
      相关资源
      最近更新 更多