5

关注点:

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

例子

public Task<ActionResult> LongRunningProcessAsync(SubmitFileModel aModel)

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

2 回答 2

4

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

根据菲尔·哈克...

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

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

于 2012-12-06T16:35:32.587 回答
0

如果是这种情况,确保不会发生这种情况的常见途径是什么?

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

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

于 2014-06-10T17:07:52.793 回答