我需要Dispose()或Close()一个EventWaitHandle吗?

Gra*_*amS 21 .net c# multithreading synchronization

如果我使用EventWaitHandle(或AutoResetEvent,ManualResetEvent)来同步线程之间然后做我需要调用Close()Dispose()方法对事件处理的时候,我用它做什么?

EventWaitHandle继承自WaitHandle,实现IDisposable.如果我没有IDisposable在包含任何类的任何类上实现,FxCop会抱怨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

这只是微软无视自己建议的一个例子吗?

Bri*_*sen 23

a的一次性资源EventWaitHandle实际上是SafeHandle(包裹在a中SafeWaitHandle).SafeHandle实现终结器,最终确保释放必要的资源,因此在这种情况下让垃圾收集器/终结器线程处理它应该是安全的.

但是,Dispose()在不再需要资源时显式调用始终是个好主意.

Cuts 3.0中的线程章节在Nutshell中说明

这种做法(可以说)可以接受等待句柄,因为它们具有轻微的操作系统负担(异步委托完全依赖于这种机制来释放它们IAsyncResult的等待句柄).


Moh*_*rty 6

您需要明确处理它们.Close()更适合它们,因为它调用Dispose().