关注IIS上长时间运行的进程

时间:2012-12-06 15:03:37

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

关注:

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

示例

public Task<ActionResult> LongRunningProcessAsync(SubmitFileModel aModel)

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

2 个答案:

答案 0 :(得分:4)

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

According to Phil Haack...

  

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

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

答案 1 :(得分:0)

  

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

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

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