If you access the AvailableWaitHandle
property, then Yes, you must call Dispose()
to cleanup unmanaged resources.
If you do not access AvailableWaitHandle
, then No, calling Dispose()
won't do anything important.
SemaphoreSlim
will create a ManualResetEvent
on demand if you access the AvailableWaitHandle
. This may be useful, for example if you need to wait on multiple handles. If you do access the AvailableWaitHandle
property, and then fail to call Dispose()
you will have a leaked ManualResetEvent
, which presumably wraps a handle to an unmanaged CreateEvent
resource that needs a corresponding call to CloseHandle
to clean up.
As other posters have pointed out, you should call Dispose()
when you are done with any object that implements IDisposable
. In this case, there are several risks to ignoring that practice, even though it may technically be safe to do so:
- My statements are based the reference source code to .NET 4.6.1. There is always the slim (pun intended) possibility that some future version of the framework will change
SemaphoreSlim
to where Dispose()
is required.
- If your
SemaphoreSlim
is exposed outside of your class, calling code might reference the AvailableWaitHandle
property not realizing that your class isn't disposing the SemaphoreSlim
and create an unmanaged resource leak.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…