簡體   English   中英

如何關閉未實現 IDisposable 的單例服務

[英]How to Close a Singleton service that does not implement IDisposable

我有一個與服務總線通信的單例服務。 我的問題是我無法優雅地實現IDisposable因為對服務總線客戶端的“關閉”調用是async - CloseAsync()

因此,我的服務類還實現了CloseAsync方法,該方法CloseAsync服務總線客戶端的CloseAsync 從我可以收集到的選項是:

  1. 在客戶端調用CloseAsync時實現 dispose 和 block。 感覺不對。
  2. startup.cs初始化一個成員變量,將其添加為Singleton ,使用ApplicationLifetime注冊一個ShutDown處理程序,然后在那里關閉我的客戶端。 好像矯枉過正。 (我已經試過了,但我的ShutDown處理程序中的代碼要么沒有命中,要么沒有運行)
  3. 只需離開它,因為應用程序無論如何都會關閉。 誘人,但也感覺不對(我喜歡清理)。

有沒有辦法攔截 DI 容器中服務的處置(我使用的是標准Microsoft.Extensions.DependencyInjection.ServiceCollection )?

在 Dispose 方法中阻止異步調用是否可以? 這樣我就可以讓我的班級自我處置。

有沒有另一種方法可以做到這一點,我失蹤了?

如果在應用程序的整個生命周期中只有一個該對象的實例,為什么還要關心處置它呢? 當應用程序關閉時,操作系統會回收其內存空間,從而有效地處理整個應用程序集及其可能創建的任何資源。

IDisposable (顯式處理)對於消耗大量內存並且可能在應用程序的生命周期內多次創建(通常是快速連續)的對象類型有意義; 例如, bitmap對象為圖像數據、 stream s 和其他數據承載/操作對象分配大緩沖區,您將多次實例化。 你放在using塊中的那種東西。

這是一個經驗法則:

僅在以下情況下才需要IDisposable :對象的每個實例都消耗大量內存(想想幾十兆字節),您需要一次創建和保留許多實例,或者您需要非常快速地連續創建許多實例。 在這些情況下,您將受益於手動處置對象。 如果這些不適合您的用例,那么垃圾收集器將完成足夠多的工作來清理未使用的資源。

我應該在單例上實現 IDisposable 嗎?

感謝@Broots 提供有用的鏈接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM