如果我正在使用EventWaitHandle
(或AutoResetEvent
,ManualResetEvent
)在线程之间进行同步,那么完成后,我需要在该事件句柄上调用Close()
或Dispose()
方法吗?EventWaitHandle
继承自WaitHandle
,后者实现了IDisposable
。而且FxCop提示如果我不对任何包含IDisposable
的类实现EventWaitHandle
。因此,这表明我确实需要调用它。
但是,这些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
这仅仅是Microsoft忽略他们自己建议的一个例子吗?
最佳答案
EventWaitHandle
的可弃资源实际上是SafeHandle
(包装在SafeWaitHandle
中)。 SafeHandle
实现一个终结器,该终结器最终确保释放了必要的资源,因此在这种情况下,让垃圾回收器/终结器线程处理它应该是安全的。
但是,当不再需要资源时,显式调用Dispose()
始终是一个好主意。
C# 3.0 in a Nutshell状态中的线程章节