我正在寻找.Net-Core 2.1的新功能Hosted Services, 我发现它们的建模非常类似于QueueBackgroundWorkItem
“队列后台”工作项似乎有一个限制,即任务必须在90秒内执行
AppDomain关闭只能延迟90秒(这实际上是HttpRuntimeSection.ShutdownTimeout和processModel shutdownTimeLimit的最小值)。如果您排队的项目太多,导致它们无法在90秒内完成,则ASP.NET运行时将卸载AppDomain,而无需等待工作项目完成。
托管服务的行为是否不同,或者此限制是否仍然适用?
我担心,如果我在托管服务上排队一些东西,如果这是一个长期运行的任务,那么它是否仍然可以保证完成?
答案 0 :(得分: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);
}
在研究托管服务的潜在问题时,我从官方文档中发现了以下内容。
Deployment considerations and takeaways
请务必注意,部署ASP.NET Core WebHost或.NET Core Host的方式可能会影响最终解决方案。例如,如果您将WebHost部署在IIS或常规的Azure App Service上,则由于应用程序池回收,主机可能会被关闭。但是,如果要将主机作为容器部署到诸如Kubernetes或Service Fabric的编排器中,则可以控制主机的活动实例的保证数量。此外,您可以考虑云中专门针对这些情况而设计的其他方法,例如Azure Functions。
但是,即使对于部署到应用程序池中的WebHost,在某些情况下,例如重新填充或刷新应用程序的内存中缓存,仍然适用。
IHostedService接口提供了一种便捷的方法来启动ASP.NET Core Web应用程序(在.NET Core 2.0中)或任何进程/主机(在具有IHost的.NET Core 2.1中启动)中的后台任务。它的主要好处是当主机本身关闭时,通过优雅地取消操作可以清理后台任务的代码。
现在,根据您的担心,我可以保证不能保证您长时间运行的任务将完成,但是可以根据托管环境(如上面引用的声明中所述)有选择地取消它们。