[英]Do I need to Dispose() or Close() an EventWaitHandle?
如果我使用EventWaitHandle
(或AutoResetEvent
、 ManualResetEvent
)在線程之間進行同步,那么當我完成它時是否需要在該事件句柄上調用Close()
或Dispose()
方法?
EventWaitHandle
繼承自WaitHandle
,后者實現了IDisposable
。 如果我沒有在任何包含 EventWaitHandle 的EventWaitHandle
上實現IDisposable
,FxCop 會抱怨。 所以這表明我確實需要調用它。
但是,這些 MSDN 使用示例都沒有調用Dispose()
或Close()
:
http://msdn.microsoft.com/en-us/library/system.threading.eventwaithandle(VS.80).aspx http://msdn.microsoft.com/en-us/library/system.threading.manualresetevent( VS.80).aspx http://msdn.microsoft.com/en-us/library/system.threading.autoresetevent(VS.80).aspx
這只是微軟無視自己建議的一個例子嗎?
EventWaitHandle
的一次性資源實際上是一個SafeHandle
(包裝在SafeWaitHandle
中)。 SafeHandle
實現了一個終結器,它最終確保釋放必要的資源,因此在這種情況下讓垃圾收集器/終結器線程處理它應該是安全的。
但是,當不再需要資源時,顯式調用Dispose()
始終是一個好主意。
這種做法(可以說)對於等待句柄是可以接受的,因為它們的操作系統負擔很輕(異步委托完全依賴這種機制來釋放其
IAsyncResult
的等待句柄)。
您需要明確處置它們。 Close() 更適合他們,因為它確實調用了 Dispose()。
MSDN 中的 Class 定義:
public class EventWaitHandle : WaitHandle
public abstract class WaitHandle : MarshalByRefObject, IDisposable
所以是的,你必須因為 WaitHandle 是 IDisposable。 如果您不這樣做,FxCop 會認為這是違反規則的。
Close 方法在內部處理它。
在釋放對 WaitHandle 的最后引用之前,請始終調用 Close 或 Dispose()。 否則,它正在使用的資源將不會被釋放。
因此,由於它們繼承了WaitHandle
,在我看來,您也應該處理EventWaitHandle
(或AutoResetEvent
、 ManualResetEvent
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.