我需要Dispose()或Close()一个EventWaitHandle吗?
如果我使用EventWaitHandle
(或AutoResetEvent
, ManualResetEvent
)来在线程之间进行同步,那么当我完成它时,是否需要在该事件句柄上调用Close()
或Dispose()
方法?
EventWaitHandle
inheritance自WaitHandle
,后者实现了IDisposable
。 如果我没有在任何包含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
这只是微软无视自己建议的一个例子吗?
SafeWaitHandle
的可支配资源实际上是一个SafeHandle
(包装在SafeWaitHandle
)。 SafeHandle
实现了一个终结器,它最终确保释放必要的资源,因此在这种情况下让垃圾收集器/终结器线程处理它应该是安全的。
但是,在不再需要资源时显式调用Dispose()
总是一个好主意。
Cuts 3.0中的线程章节在Nutshell中说明
这种做法(可以说)可以接受等待句柄,因为它们有轻微的操作系统负担(异步委托完全依赖于这种机制来释放它们的
IAsyncResult
的等待句柄)。
您需要明确处理它们。 Close()更适合它们,因为它调用Dispose()。
MSDN的类定义:
public class EventWaitHandle : WaitHandle public abstract class WaitHandle : MarshalByRefObject, IDisposable
所以是的,你必须因为WaitHandle是IDisposable。 如果不这样做,FxCop会发现这违反规则。