0 out of 2 rated this helpful - Rate this topic

SemaphoreSlim Class

A lightweight alternative to Semaphore that limits the number of threads that can access a resource or pool of resources concurrently.

System.Object
  System.Threading.SemaphoreSlim

Namespace:  System.Threading
Assembly:  mscorlib (in mscorlib.dll)
[ComVisibleAttribute(false)]
[HostProtectionAttribute(SecurityAction.LinkDemand, Synchronization = true, 
	ExternalThreading = true)]
public class SemaphoreSlim : IDisposable

The SemaphoreSlim type exposes the following members.

  Name Description
Public method SemaphoreSlim(Int32) Initializes a new instance of the SemaphoreSlim class, specifying the initial number of requests that can be granted concurrently.
Public method SemaphoreSlim(Int32, Int32) Initializes a new instance of the SemaphoreSlim class, specifying the initial and maximum number of requests that can be granted concurrently.
Top
  Name Description
Public property AvailableWaitHandle Returns a WaitHandle that can be used to wait on the semaphore.
Public property CurrentCount Gets the number of threads that will be allowed to enter the SemaphoreSlim.
Top
  Name Description
Public method Dispose() Releases all resources used by the current instance of the SemaphoreSlim class.
Protected method Dispose(Boolean) When overridden in a derived class, releases the unmanaged resources used by the ManualResetEventSlim, and optionally releases the managed resources.
Public method Equals(Object) Determines whether the specified Object is equal to the current Object. (Inherited from Object.)
Protected method Finalize Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection. (Inherited from Object.)
Public method GetHashCode Serves as a hash function for a particular type. (Inherited from Object.)
Public method GetType Gets the Type of the current instance. (Inherited from Object.)
Protected method MemberwiseClone Creates a shallow copy of the current Object. (Inherited from Object.)
Public method Release() Exits the SemaphoreSlim once.
Public method Release(Int32) Exits the SemaphoreSlim a specified number of times.
Public method ToString Returns a string that represents the current object. (Inherited from Object.)
Public method Wait() Blocks the current thread until it can enter the SemaphoreSlim.
Public method Wait(CancellationToken) Blocks the current thread until it can enter the SemaphoreSlim, while observing a CancellationToken.
Public method Wait(Int32) Blocks the current thread until it can enter the SemaphoreSlim, using a 32-bit signed integer that specifies the timeout.
Public method Wait(TimeSpan) Blocks the current thread until it can enter the SemaphoreSlim, using a TimeSpan to specify the timeout.
Public method 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.
Public method Wait(TimeSpan, CancellationToken) Blocks the current thread until it can enter the SemaphoreSlim, using a TimeSpan that specifies the timeout, while observing a CancellationToken.
Top

The SemaphoreSlim provides a lightweight semaphore class that doesn't use Windows kernel semaphores.

Note 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();
    }
}


.NET Framework

Supported in: 4

.NET Framework Client Profile

Supported in: 4

Windows 7, Windows Vista SP1 or later, Windows XP SP3, Windows Server 2008 (Server Core not supported), Windows Server 2008 R2 (Server Core supported with SP1 or later), Windows Server 2003 SP2

The .NET Framework does not support all versions of every platform. For a list of the supported versions, see .NET Framework System Requirements.

All public and protected members of SemaphoreSlim are thread-safe and may be used concurrently from multiple threads, with the exception of Dispose, which must only be used when all other operations on the SemaphoreSlim have completed.

Did you find this helpful?
(1500 characters remaining)
Community Content Add
Annotations FAQ