如何关闭未实现 IDisposable 的单例服务
How to Close a Singleton service that does not implement IDisposable
我有一个与服务总线对话的单例服务。我的问题是我无法优雅地实现 IDisposable
,因为对服务总线客户端的 "Close" 调用是 async
- CloseAsync()
。
因此,我的服务 class 还实现了一个 CloseAsync
方法,该方法服从服务总线客户端的 CloseAsync
。
据我所知,我的选择是:
- 在客户端调用
CloseAsync
时执行处置和阻止。感觉不对。
- 初始化
startup.cs
中的一个成员变量,将其添加为 Singleton
,使用 ApplicationLifetime
注册一个 ShutDown
处理程序,然后关闭我的客户端。似乎有点矫枉过正。 (我已经试过了,但是我的 ShutDown
处理程序中的代码要么没有被命中,要么没有被 运行)
- 干脆离开吧,因为应用程序无论如何都会关闭。很诱人,但也感觉不对(我喜欢收拾)
有没有办法拦截DI容器中服务的处置(我用的是标准的Microsoft.Extensions.DependencyInjection.ServiceCollection
)?
是否可以在 Dispose 方法中阻止异步调用?这样我就可以让我的 class 自我处置。
是否还有其他我想念的方法?
如果您在应用程序的整个生命周期中只有一个此对象的实例,为什么要关心处置它?当一个应用程序关闭时,它的内存 space 被 OS 回收,有效地处理整个应用程序集和它可能创建的任何资源。
IDisposable
(显式处置)对于消耗大量内存并且可能在应用程序的生命周期中多次创建(通常是快速连续)的对象类型有意义;例如,bitmap
为图像数据分配大缓冲区的对象、stream
s 和其他数据 carrying/manipulating 您要实例化多次的对象。那种你会放在 using
块中的东西。
这是一条经验法则:
只有在以下情况下才需要 IDisposable
:对象的每个实例都消耗大量内存(想想几十兆字节),您需要一次创建和保留许多实例,或者您需要创建许多实例接连不断。在这些情况下,您将受益于手动处置对象。如果这些不适合您的用例,那么垃圾收集器将完成清理未使用资源的工作。
Should I implement IDisposable on a singleton?
感谢@Broots 的帮助link。
我有一个与服务总线对话的单例服务。我的问题是我无法优雅地实现 IDisposable
,因为对服务总线客户端的 "Close" 调用是 async
- CloseAsync()
。
因此,我的服务 class 还实现了一个 CloseAsync
方法,该方法服从服务总线客户端的 CloseAsync
。
据我所知,我的选择是:
- 在客户端调用
CloseAsync
时执行处置和阻止。感觉不对。 - 初始化
startup.cs
中的一个成员变量,将其添加为Singleton
,使用ApplicationLifetime
注册一个ShutDown
处理程序,然后关闭我的客户端。似乎有点矫枉过正。 (我已经试过了,但是我的ShutDown
处理程序中的代码要么没有被命中,要么没有被 运行) - 干脆离开吧,因为应用程序无论如何都会关闭。很诱人,但也感觉不对(我喜欢收拾)
有没有办法拦截DI容器中服务的处置(我用的是标准的Microsoft.Extensions.DependencyInjection.ServiceCollection
)?
是否可以在 Dispose 方法中阻止异步调用?这样我就可以让我的 class 自我处置。
是否还有其他我想念的方法?
如果您在应用程序的整个生命周期中只有一个此对象的实例,为什么要关心处置它?当一个应用程序关闭时,它的内存 space 被 OS 回收,有效地处理整个应用程序集和它可能创建的任何资源。
IDisposable
(显式处置)对于消耗大量内存并且可能在应用程序的生命周期中多次创建(通常是快速连续)的对象类型有意义;例如,bitmap
为图像数据分配大缓冲区的对象、stream
s 和其他数据 carrying/manipulating 您要实例化多次的对象。那种你会放在 using
块中的东西。
这是一条经验法则:
只有在以下情况下才需要 IDisposable
:对象的每个实例都消耗大量内存(想想几十兆字节),您需要一次创建和保留许多实例,或者您需要创建许多实例接连不断。在这些情况下,您将受益于手动处置对象。如果这些不适合您的用例,那么垃圾收集器将完成清理未使用资源的工作。
Should I implement IDisposable on a singleton?
感谢@Broots 的帮助link。