作为尝试正常关闭 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)中启动后台任务的便捷方式。它的主要好处是您有机会在主机本身关闭时优雅地取消清理后台任务的代码。
现在,基于您的担忧,我认为不能保证您的长时间运行的任务会完成,但他们可能会根据上面引用的声明中解释的托管环境获得正常取消的机会。