1

我正在查看 .Net-Core 2.1 新功能Hosted Services,我发现它们与QueueBackgroundWorkItem的建模非常相似

队列后台工作项似乎有一个限制,即任务必须在 90 秒内执行

AppDomain 关闭只能延迟 90 秒(实际上是 HttpRuntimeSection.ShutdownTimeout 和 processModel shutdownTimeLimit 的最小值)。如果排队的项目太多以至于无法在 90 秒内完成,那么 ASP.NET 运行时将卸载 AppDomain 而无需等待工作项目完成。

托管服务是否有不同的行为,或者此限制是否仍然适用?

我担心如果我在我的托管服务上排队,如果它是一个运行时间很长的任务,它是否仍能保证完成?

4

1 回答 1

3

作为尝试正常关闭 Web 主机的一部分,将结合配置的取消令牌构建ShutdownTimeout

var timeoutToken = new CancellationTokenSource(Options.ShutdownTimeout).Token;
if (!cancellationToken.CanBeCanceled)
{
    cancellationToken = timeoutToken;
}
else
{
    cancellationToken = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, timeoutToken).Token;
}

资源

这成为停止托管服务时的关闭令牌

// Fire the IHostedService.Stop
if (_hostedServiceExecutor != null)
{
    await _hostedServiceExecutor.StopAsync(cancellationToken).ConfigureAwait(false);
}

在研究托管服务的潜在问题时,我从官方文档中发现了以下内容。

部署注意事项和要点

请务必注意,部署 ASP.NET Core WebHost 或 .NET Core 主机的方式可能会影响最终解决方案。例如,如果您将 WebHost 部署在 IIS 或常规 Azure App Service 上,您的主机可能会因为应用程序池回收而关闭。但是,如果您将主机作为容器部署到 Kubernetes 或 Service Fabric 等编排器中,则可以控制主机的活动实例的确定数量。此外,您可以考虑专门为这些场景设计的云中的其他方法,例如 Azure Functions。

但即使对于部署到应用程序池中的 WebHost,也存在诸如重新填充或刷新应用程序的内存缓存之类的场景,这仍然适用。

IHostedService 接口提供了一种在 ASP.NET Core Web 应用程序(在 .NET Core 2.0 中)或在任何进程/主机(在 .NET Core 2.1 中使用 IHost)中启动后台任务的便捷方式。它的主要好处是您有机会在主机本身关闭时优雅地取消清理后台任务的代码。

现在,基于您的担忧,我认为不能保证您的长时间运行的任务会完成,但他们可能会根据上面引用的声明中解释的托管环境获得正常取消的机会。

于 2018-07-07T16:35:22.830 回答