.Net核心托管服务保证完成

问题描述 投票:1回答:1

我正在看.Net-Core 2.1新功能Hosted Services,我看到它们与QueueBackgroundWorkItem非常相似

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

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

托管服务是否有不同的行为或这种限制是否仍适用?

我担心如果我在托管服务上排队,如果这是一个非常长时间运行的任务,它仍然可以保证完成吗?

c# asp.net-core .net-core backgroundworker asp.net-core-hosted-services
1个回答
3
投票

作为尝试优雅地关闭Web主机的一部分,与配置的ShutdownTimeout一起构建取消令牌

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

Source

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

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

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

Deployment considerations and takeaways

请务必注意,部署ASP.NET Core WebHost或.NET Core Host的方式可能会影响最终解决方案。例如,如果在IIS或常规Azure应用服务上部署WebHost,则可能会因应用程序池回收而关闭主机。但是,如果要将主机作为容器部署到Kubernetes或Service Fabric等协调器中,则可以控制主机的实时实例数量。此外,您可以考虑云中的其他方法,尤其是针对这些方案,例如Azure Functions。

但即使对于部署到应用程序池中的WebHost,也存在重新填充或刷新应用程序的内存缓存等情况,这些情况仍然适用。

IHostedService接口提供了一种在ASP.NET Core Web应用程序(在.NET Core 2.0中)或任何进程/主机(从带有IHost的.NET Core 2.1开始)中启动后台任务的便捷方法。它的主要好处是,当主机本身关闭时,您可以通过优雅取消来清理后台任务的代码。

现在基于您的担忧,我会收集到无法保证您的长期任务将完成,但他们可能会有机会根据托管环境进行优雅取消,如上面引用的声明中所述。

© www.soinside.com 2019 - 2024. All rights reserved.