SemaphoreSlim Class
A lightweight alternative to Semaphore that limits the number of threads that can access a resource or pool of resources concurrently.
Namespace: System.Threading
Assembly: mscorlib (in mscorlib.dll)
The SemaphoreSlim type exposes the following members.
| Name | Description | |
|---|---|---|
![]() ![]() ![]() | SemaphoreSlim(Int32) | Initializes a new instance of the SemaphoreSlim class, specifying the initial number of requests that can be granted concurrently. |
![]() ![]() ![]() | SemaphoreSlim(Int32, Int32) | Initializes a new instance of the SemaphoreSlim class, specifying the initial and maximum number of requests that can be granted concurrently. |
| Name | Description | |
|---|---|---|
![]() ![]() ![]() | AvailableWaitHandle | Returns a WaitHandle that can be used to wait on the semaphore. |
![]() ![]() ![]() | CurrentCount | Gets the number of threads that will be allowed to enter the SemaphoreSlim. |
| Name | Description | |
|---|---|---|
![]() ![]() ![]() | Dispose() | Releases all resources used by the current instance of the SemaphoreSlim class. |
![]() ![]() ![]() | Dispose(Boolean) | Releases the unmanaged resources used by the SemaphoreSlim, and optionally releases the managed resources. |
![]() ![]() ![]() | Equals(Object) | Determines whether the specified object is equal to the current object. (Inherited from Object.) |
![]() ![]() ![]() | Finalize | Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection. (Inherited from Object.) |
![]() ![]() ![]() | GetHashCode | Serves as a hash function for a particular type. (Inherited from Object.) |
![]() ![]() ![]() | GetType | Gets the Type of the current instance. (Inherited from Object.) |
![]() ![]() ![]() | MemberwiseClone | Creates a shallow copy of the current Object. (Inherited from Object.) |
![]() ![]() ![]() | Release() | Exits the SemaphoreSlim once. |
![]() ![]() ![]() | Release(Int32) | Exits the SemaphoreSlim a specified number of times. |
![]() ![]() ![]() | ToString | Returns a string that represents the current object. (Inherited from Object.) |
![]() ![]() ![]() | Wait() | Blocks the current thread until it can enter the SemaphoreSlim. |
![]() ![]() ![]() | Wait(CancellationToken) | Blocks the current thread until it can enter the SemaphoreSlim, while observing a CancellationToken. |
![]() ![]() ![]() | Wait(Int32) | Blocks the current thread until it can enter the SemaphoreSlim, using a 32-bit signed integer that specifies the timeout. |
![]() ![]() ![]() | Wait(TimeSpan) | Blocks the current thread until it can enter the SemaphoreSlim, using a TimeSpan to specify the timeout. |
![]() ![]() ![]() | Wait(Int32, CancellationToken) | Blocks the current thread until it can enter the SemaphoreSlim, using a 32-bit signed integer that specifies the timeout, while observing a CancellationToken. |
![]() ![]() ![]() | Wait(TimeSpan, CancellationToken) | Blocks the current thread until it can enter the SemaphoreSlim, using a TimeSpan that specifies the timeout, while observing a CancellationToken. |
![]() ![]() | WaitAsync() | Asynchronously waits to enter the SemaphoreSlim. |
![]() ![]() | WaitAsync(CancellationToken) | Asynchronously waits to enter the SemaphoreSlim, while observing a CancellationToken. |
![]() ![]() | WaitAsync(Int32) | Asynchronously waits to enter the SemaphoreSlim, using a 32-bit signed integer to measure the time interval. |
![]() ![]() | WaitAsync(TimeSpan) | Asynchronously waits to enter the SemaphoreSlim, using a TimeSpan to measure the time interval. |
![]() ![]() | WaitAsync(Int32, CancellationToken) | Asynchronously waits to enter the SemaphoreSlim, using a 32-bit signed integer to measure the time interval, while observing a CancellationToken. |
![]() ![]() | WaitAsync(TimeSpan, CancellationToken) | Asynchronously waits to enter the SemaphoreSlim, using a TimeSpan to measure the time interval, while observing a CancellationToken. |
The SemaphoreSlim provides a lightweight semaphore class that doesn't use Windows kernel semaphores.
Note |
|---|
The HostProtectionAttribute attribute applied to this type or member has the following Resources property value: Synchronization | ExternalThreading. The HostProtectionAttribute does not affect desktop applications (which are typically started by double-clicking an icon, typing a command, or entering a URL in a browser). For more information, see the HostProtectionAttribute class or SQL Server Programming and Host Protection Attributes. |
The following example shows how to use a SemaphoreSlim:
using System; using System.Threading; using System.Threading.Tasks; class SemaphoreSlimDemo { // Demonstrates: // SemaphoreSlim construction // SemaphoreSlim.Wait() // SemaphoreSlim.Release() // SemaphoreSlim.AvailableWaitHandle static void Main() { SemaphoreSlim ss = new SemaphoreSlim(2); // set initial count to 2 Console.WriteLine("Constructed a SemaphoreSlim with an initial count of 2"); Console.WriteLine("First non-blocking Wait: {0} (should be true)", ss.Wait(0)); Console.WriteLine("Second non-blocking Wait: {0} (should be true)", ss.Wait(0)); Console.WriteLine("Third non-blocking Wait: {0} (should be false)", ss.Wait(0)); // Do a Release to free up a spot ss.Release(); Console.WriteLine("Non-blocking Wait after Release: {0} (should be true)", ss.Wait(0)); // Launch an asynchronous Task that releases the semaphore after 100 ms Task t1 = Task.Factory.StartNew(() => { Thread.Sleep(100); Console.WriteLine("Task about to release SemaphoreSlim"); ss.Release(); }); // You can also wait on the SemaphoreSlim via the underlying Semaphore WaitHandle. // HOWEVER, unlike SemaphoreSlim.Wait(), it WILL NOT decrement the count. // In the printout below, you will see that CurrentCount is still 1 ss.AvailableWaitHandle.WaitOne(); Console.WriteLine("ss.AvailableWaitHandle.WaitOne() returned, ss.CurrentCount = {0}", ss.CurrentCount); // Now a real Wait(), which should return immediately and decrement the count. ss.Wait(); Console.WriteLine("ss.CurrentCount after ss.Wait() = {0}", ss.CurrentCount); // Clean up t1.Wait(); ss.Dispose(); } }
Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008 (Server Core Role not supported), Windows Server 2008 R2 (Server Core Role supported with SP1 or later; Itanium not supported)
The .NET Framework does not support all versions of every platform. For a list of the supported versions, see .NET Framework System Requirements.


