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

时间:2009-03-18 19:49:19

标签: c# .net multithreading synchronization

如果我使用EventWaitHandle(或AutoResetEventManualResetEvent)在线程之间进行同步,那么我是否需要调用Close()Dispose()方法当我完成它时,该事件会处理吗?

EventWaitHandle继承自WaitHandle,后者实现IDisposable。如果我没有在包含IDisposable的任何类上实现EventWaitHandle,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

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

4 个答案:

答案 0 :(得分:23)

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

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

C# 3.0 in a Nutshell州的线程章节

  

这种做法(可以说)是可以接受的   等待句柄,因为他们有一个   轻微操作系统负担(异步   代表们完全依赖这种机制   释放他们IAsyncResult的等待   处理)。

答案 1 :(得分:6)

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

答案 2 :(得分:2)

MSDN的类定义:

public class EventWaitHandle : WaitHandle
public abstract class WaitHandle : MarshalByRefObject, IDisposable

所以是的,你必须因为WaitHandle是IDisposable。如果不这样做,FxCop会发现这违反规则。

答案 3 :(得分:0)

Close方法在内部对其进行处理。