如果我正在使用EventWaitHandle(或AutoResetEventManualResetEvent)在线程之间进行同步,那么完成后,我需要在该事件句柄上调用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状态中的线程章节

09-25 22:23