If I am using EventWaitHandle
(or AutoResetEvent
, ManualResetEvent
) to synchronise between threads then do I need to call the Close()
or Dispose()
methods on that event handle when I am done with it?
EventWaitHandle
inherits from WaitHandle
, which implements IDisposable
. And FxCop complains if I don't implement IDisposable
on any class that contains an EventWaitHandle
. So this suggests that I do need to call it.
However none of these MSDN usage examples call Dispose()
or 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
Is this just an example of Microsoft ignoring their own advice?
The disposable resource of an EventWaitHandle
is actually a SafeHandle
(wrapped in a SafeWaitHandle
). SafeHandle
implements a finalizer, which eventually makes sure the necessary resource is release, so it should be safe to let the garbage collector / finalizer thread handle it in this case.
However, it is always a good idea to explicitly call Dispose()
when the resource is no longer needed.
The threading chapter in C# 3.0 in a Nutshell states
This practice is (arguably) acceptable
with wait handles because they have a
light OS burden (asynchronous
delegates rely on exactly this mechanism
to release their IAsyncResult
's wait
handle).
You need to dispose them explicitly. Close() is more appropriate for them as it does call Dispose().
Class definitions from MSDN:
public class EventWaitHandle : WaitHandle
public abstract class WaitHandle : MarshalByRefObject, IDisposable
So yes you must as WaitHandle is IDisposable. FxCop would find this as a rule violation if you didn't.