关注:
我已阅读过描述IIS可随时回收应用程序池的帖子/博客。这是否意味着(就IIS回收应用程序池而言)如果我同步或异步调用长时间运行的进程,那么IIS是否可以回收应用程序池并终止长时间运行的进程?如果是这种情况,那么确保不会发生这种情况的常见途径是什么?
示例
public Task<ActionResult> LongRunningProcessAsync(SubmitFileModel aModel)
{
return Task.Run( () => LongRunningProcess( aModel) );
}
答案 0 :(得分:4)
HostingEnvironment有一个静态方法RegisterObject,允许您将对象放在应用程序的已注册对象列表中。
当ASP.NET取消AppDomain时,它将首先尝试调用 在所有已注册的对象上停止方法....当ASP.NET调用此方法时,您的代码需要阻止此方法返回,直到您的工作完成。
或者,您可以创建不由IIS托管的服务。
答案 1 :(得分:0)
如果是这种情况,有哪些常见途径可以确保不会发生这种情况?
您的应用程序域将在回收过程中卸载,无论是否使用RegisterObject
方法。它只为您的后台工作提供一些时间来完成(默认为30秒)。如果你有长时间运行的工作超过这个时间&#34;,它将被中止,没有人会关心重启时的自动重试。
如果要在ASP.NET应用程序中运行长时间运行的作业,想要保持简单,并忘记ASP.NET / IIS问题,请查看HangFire - 它使用持久存储(SQL Server)或Redis)并且对回收过程具有免疫力。