如何关闭未实现 IDisposable 的单例服务

How to Close a Singleton service that does not implement IDisposable

我有一个与服务总线对话的单例服务。我的问题是我无法优雅地实现 IDisposable,因为对服务总线客户端的 "Close" 调用是 async - CloseAsync()

因此,我的服务 class 还实现了一个 CloseAsync 方法,该方法服从服务总线客户端的 CloseAsync。 据我所知,我的选择是:

  1. 在客户端调用 CloseAsync 时执行处置和阻止。感觉不对。
  2. 初始化 startup.cs 中的一个成员变量,将其添加为 Singleton,使用 ApplicationLifetime 注册一个 ShutDown 处理程序,然后关闭我的客户端。似乎有点矫枉过正。 (我已经试过了,但是我的 ShutDown 处理程序中的代码要么没有被命中,要么没有被 运行)
  3. 干脆离开吧,因为应用程序无论如何都会关闭。很诱人,但也感觉不对(我喜欢收拾)

有没有办法拦截DI容器中服务的处置(我用的是标准的Microsoft.Extensions.DependencyInjection.ServiceCollection)?

是否可以在 Dispose 方法中阻止异步调用?这样我就可以让我的 class 自我处置。

是否还有其他我想念的方法?

如果您在应用程序的整个生命周期中只有一个此对象的实例,为什么要关心处置它?当一个应用程序关闭时,它的内存 space 被 OS 回收,有效地处理整个应用程序集和它可能创建的任何资源。

IDisposable(显式处置)对于消耗大量内存并且可能在应用程序的生命周期中多次创建(通常是快速连续)的对象类型有意义;例如,bitmap 为图像数据分配大缓冲区的对象、streams 和其他数据 carrying/manipulating 您要实例化多次的对象。那种你会放在 using 块中的东西。

这是一条经验法则:

只有在以下情况下才需要 IDisposable:对象的每个实例都消耗大量内存(想想几十兆字节),您需要一次创建和保留许多实例,或者您需要创建许多实例接连不断。在这些情况下,您将受益于手动处置对象。如果这些不适合您的用例,那么垃圾收集器将完成清理未使用资源的工作。

Should I implement IDisposable on a singleton?

感谢@Broots 的帮助link。