[英]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.