[英]Do I need to Dispose a SemaphoreSlim
根據文件:
“
SemaphoreSlim
不使用Windows內核信號量”。
是否有SemaphoreSlim
使用的特殊資源,當不再使用SemaphoreSlim
時調用Dispose
很重要?
如果您訪問AvailableWaitHandle屬性, 然后是 ,則必須調用Dispose()來清理非托管資源。
如果您沒有訪問AvailableWaitHandle, 那么調用Dispose()將不會執行任何重要操作。
如果您訪問AvailableWaitHandle,SemaphoreSlim將根據需要創建ManualResetEvent。 這可能很有用,例如,如果您需要等待多個句柄。 如果您確實訪問了AvailableWaitHandle屬性,然后無法調用Dispose(),則會有一個泄漏的ManualResetEvent,它可能會包含一個非托管CreateEvent資源的句柄,該資源需要對CloseHandle進行相應的調用以進行清理。
正如其他海報所指出的,當你完成任何實現IDisposable的對象時,你應該調用Dispose()。 在這種情況下,忽略這種做法有幾種風險,即使在技術上可能是安全的:
是。
它可能使用一個使用SafeWaitHandle
的ManualResetEvent
,它是一個SafeHandle
,它有一個非托管句柄。
您可以在參考源中看到它。
SafeHandle
是可以最終確定的,所以如果你不處理它(通過處理SemaphoreSlim
),它將轉到需要為你完成的終結器。 由於終結器是單線程,因此在某些情況下可能會過度工作,因此始終建議配置可終結的對象。
您應該始終在任何實現IDisposable
類上調用Dispose()
(或將其置於using
語句中),而不是根據其內部實現做出決定。 類作者已經通過實現IDisposable
接口為您做出了這個決定。
對於許多其他課程,我同意i3arnon,但對於SemaphoreSlim,我會選擇Tim的評論。 如果你在一個低級別的類中使用SemaphoreSlim並且必須處理它,那么幾乎你的程序中的所有內容都將成為IDisposable,而實際上它並不是必需的。 鑒於AvailableWaitHandle非常專業且通常不使用,因此更為真實。
為了防止其他編碼人員訪問AvailableWaitHandle,您可以將其包裝在非一次性類中。 你可以在Cleary和Hanselman的包裝中看到這一點,兩者都是基於Stephen Toub的一篇文章(順便提一下,它沒有Dispose)。
PS對於IDisposable合同,只需在文檔中指定只有在訪問AvailableWaitHandle時才需要Dispose。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.