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

时间:2018-07-02 21:37:53

标签: c# asp.net-core .net-core backgroundworker asp.net-core-hosted-services

我正在寻找.Net-Core 2.1的新功能Hosted Services, 我发现它们的建模非常类似于QueueBackgroundWorkItem

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

  

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

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

我担心,如果我在托管服务上排队一些东西,如果这是一个长期运行的任务,那么它是否仍然可以保证完成?

1 个答案:

答案 0 :(得分: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的方式可能会影响最终解决方案。例如,如果您将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中启动)中的后台任务。它的主要好处是当主机本身关闭时,通过优雅地取消操作可以清理后台任务的代码。

现在,根据您的担心,我可以保证不能保证您长时间运行的任务将完成,但是可以根据托管环境(如上面引用的声明中所述)有选择地取消它们。