在IIS上长时间运行进程的问题

5

问题:

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

示例:

public Task<ActionResult> LongRunningProcessAsync(SubmitFileModel aModel)

    {
        return Task.Run( () => LongRunningProcess( aModel) );
    }
2个回答

4

HostingEnvironment 有一个静态方法RegisterObject,可以让你将一个对象放入应用程序的注册对象列表中。

根据Phil Haack的说法...

当ASP.NET关闭AppDomain时,它首先会尝试调用所有已注册对象的Stop方法.... 当ASP.NET调用此方法时,您的代码需要防止该方法返回,直到完成工作为止。

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


太好了!这正是我所需要的。 - Luke G

0
如果是这种情况,如何确保不会发生这种情况的常见路径是什么?
无论是否使用RegisterObject方法,在回收进程中都将卸载应用程序域。它只给您的后台工作一些时间来完成(默认为30秒)。如果您有超过此“某些时间”的长时间运行作业,它将被中止,并且没有人会关心重新启动时的自动重试。
如果您想在ASP.NET应用程序中运行长时间运行的作业,想要保持简单,并忘记ASP.NET/IIS问题,请查看HangFire - 它使用持久存储(SQL Server或Redis)并对回收进程具有免疫力。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接