Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Do I need to Dispose a SemaphoreSlim

According to the documentation:

"a SemaphoreSlim doesn't use a Windows kernel semaphore".

Are there any special resources used by the SemaphoreSlim which make it important to call Dispose when the SemaphoreSlim will no longer be used?

like image 951
Tom Deseyn Avatar asked Aug 16 '15 08:08

Tom Deseyn


2 Answers

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:

  1. 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.
  2. 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.
like image 64
Tim Avatar answered Sep 20 '22 12:09

Tim


Yes.

It may use a ManualResetEvent that uses a SafeWaitHandle which is a SafeHandle and it has an unmanaged handle.

You can see it in the reference source here.

SafeHandle is finalizable so if you don't dispose of it (by disposing of the SemaphoreSlim) it will go to the finalizer that will need to do that for you. Since the finalizer is a single thread it may get overworked in certain situations so it's always advisable to dispose finalizable objects.

like image 23
i3arnon Avatar answered Sep 19 '22 12:09

i3arnon