.NET Core托管服务和单例服务的区别

21

从.NET Core 2.1开始,我们现在可以使用托管服务来运行后台任务。

我相信通过将服务类添加到单例作用域的服务容器中,我们也可以实现相同的功能。

与具有单例作用域的服务相比,拥有托管服务的好处是什么?它们之间的主要区别是什么?

我们可以将单例作用域的服务注入到控制器中,并在每个新请求中操纵它。然而,这对于托管服务来说是不可能的。


文档中指出:当您使用任何AddHostedService扩展方法注册IHostedService的实现时,该服务将被注册为单例。 - Menahem
1个回答

37

托管服务实际上是单例服务。不同之处在于托管服务具有特定的生命周期:当(web)主机启动时,托管服务将启动,而当(web)主机关闭时,托管服务也会被明确终止。这允许您包含启动或关闭行为,例如建立或终止与外部服务的连接。

相比之下,注册为单例的普通服务仅在首次解析时实例化,并在应用程序关闭期间服务提供程序被处理时进行释放。

因此,托管服务让您对应用程序启动或停止时如何处理服务拥有更多控制权。但这并没有太多的神奇成分。


使用托管服务是否存在任何缺点,相对于单例模式?例如,如果我想让我的Singleton / HostedService在正常的 ~ 10分钟间隔内与集群中的其他服务器“签到”,那么我需要在HostedService中执行此操作,以确保其始终在应用程序的生命周期内运行,对其余应用程序有什么性能影响? - whendon
2
@whendon 由于单例服务不会自动执行任何操作,除非您明确让它执行某些操作:是的,托管服务是您要使用的,因为框架将在应用程序启动时激活它。在您的情况下,您可以从BackgroundService继承,并使用await Task.Delay(TimeSpan.FromMinutes(10))进行循环以间隔暂停。它是异步的,这意味着在等待时间期间对性能的影响将大大降低。 - poke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接