簡體   English   中英

我是否需要處理SemaphoreSlim

[英]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()。 在這種情況下,忽略這種做法有幾種風險,即使在技術上可能是安全的:

  1. 我的陳述基於.NET 4.6.1的參考源代碼。 總是有一種纖細(雙關語)的可能性,框架的某些未來版本會將SemaphoreSlim更改為需要Dispose()的地方。
  2. 如果您的SemaphoreSlim暴露在您的類之外,則調用代碼可能會引用AvailableWaitHandle屬性,而不會意識到您的類沒有處置SemaphoreSlim並創建非托管資源泄漏。

是。

它可能使用一個使用SafeWaitHandleManualResetEvent ,它是一個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.

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