[英]How to Close a Singleton service that does not implement IDisposable
我有一个与服务总线通信的单例服务。 我的问题是我无法优雅地实现IDisposable
因为对服务总线客户端的“关闭”调用是async
- CloseAsync()
。
因此,我的服务类还实现了CloseAsync
方法,该方法CloseAsync
服务总线客户端的CloseAsync
。 从我可以收集到的选项是:
CloseAsync
时实现 dispose 和 block。 感觉不对。startup.cs
初始化一个成员变量,将其添加为Singleton
,使用ApplicationLifetime
注册一个ShutDown
处理程序,然后在那里关闭我的客户端。 好像矫枉过正。 (我已经试过了,但我的ShutDown
处理程序中的代码要么没有命中,要么没有运行) 有没有办法拦截 DI 容器中服务的处置(我使用的是标准Microsoft.Extensions.DependencyInjection.ServiceCollection
)?
在 Dispose 方法中阻止异步调用是否可以? 这样我就可以让我的班级自我处置。
有没有另一种方法可以做到这一点,我失踪了?
如果在应用程序的整个生命周期中只有一个该对象的实例,为什么还要关心处置它呢? 当应用程序关闭时,操作系统会回收其内存空间,从而有效地处理整个应用程序集及其可能创建的任何资源。
IDisposable
(显式处理)对于消耗大量内存并且可能在应用程序的生命周期内多次创建(通常是快速连续)的对象类型有意义; 例如, bitmap
对象为图像数据、 stream
s 和其他数据承载/操作对象分配大缓冲区,您将多次实例化。 你放在using
块中的那种东西。
这是一个经验法则:
仅在以下情况下才需要IDisposable
:对象的每个实例都消耗大量内存(想想几十兆字节),您需要一次创建和保留许多实例,或者您需要非常快速地连续创建许多实例。 在这些情况下,您将受益于手动处置对象。 如果这些不适合您的用例,那么垃圾收集器将完成足够多的工作来清理未使用的资源。
感谢@Broots 提供有用的链接。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.