我正在看.Net-Core 2.1新功能Hosted Services,我看到它们与QueueBackgroundWorkItem非常相似
队列后台工作项似乎有一个限制,任务必须在90秒内执行
AppDomain关闭只能延迟90秒(实际上是HttpRuntimeSection.ShutdownTimeout和processModel shutdownTimeLimit的最小值)。如果排队的项目太多而无法在90秒内完成,则ASP.NET运行时将卸载AppDomain而不等待工作项完成。
托管服务是否有不同的行为或这种限制是否仍适用?
我担心如果我在托管服务上排队,如果这是一个非常长时间运行的任务,它仍然可以保证完成吗?
作为尝试优雅地关闭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的方式可能会影响最终解决方案。例如,如果在IIS或常规Azure应用服务上部署WebHost,则可能会因应用程序池回收而关闭主机。但是,如果要将主机作为容器部署到Kubernetes或Service Fabric等协调器中,则可以控制主机的实时实例数量。此外,您可以考虑云中的其他方法,尤其是针对这些方案,例如Azure Functions。
但即使对于部署到应用程序池中的WebHost,也存在重新填充或刷新应用程序的内存缓存等情况,这些情况仍然适用。
IHostedService接口提供了一种在ASP.NET Core Web应用程序(在.NET Core 2.0中)或任何进程/主机(从带有IHost的.NET Core 2.1开始)中启动后台任务的便捷方法。它的主要好处是,当主机本身关闭时,您可以通过优雅取消来清理后台任务的代码。
现在基于您的担忧,我会收集到无法保证您的长期任务将完成,但他们可能会有机会根据托管环境进行优雅取消,如上面引用的声明中所述。