Information
The topic you requested is included in another documentation set. For convenience, it's displayed below. Choose Switch to see the topic in its original location.

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)

'Declaration
<ComVisibleAttribute(False)> _
<HostProtectionAttribute(SecurityAction.LinkDemand, Synchronization := True,  _
	ExternalThreading := True)> _
Public Class SemaphoreSlim _
	Implements IDisposable

The SemaphoreSlim type exposes the following members.

  NameDescription
Public methodSupported by Portable Class LibrarySupported in .NET for Windows Store appsSemaphoreSlim(Int32)Initializes a new instance of the SemaphoreSlim class, specifying the initial number of requests that can be granted concurrently.
Public methodSupported by Portable Class LibrarySupported in .NET for Windows Store appsSemaphoreSlim(Int32, Int32)Initializes a new instance of the SemaphoreSlim class, specifying the initial and maximum number of requests that can be granted concurrently.
Top

  NameDescription
Public propertySupported by Portable Class LibrarySupported in .NET for Windows Store appsAvailableWaitHandleReturns a WaitHandle that can be used to wait on the semaphore.
Public propertySupported by Portable Class LibrarySupported in .NET for Windows Store appsCurrentCountGets the number of remaining threads that can access the resource protected by the SemaphoreSlim object.
Top

  NameDescription
Public methodSupported by Portable Class LibrarySupported in .NET for Windows Store appsDisposeReleases all resources used by the current instance of the SemaphoreSlim class.
Protected methodSupported by Portable Class LibrarySupported in .NET for Windows Store appsDispose(Boolean)Releases the unmanaged resources used by the SemaphoreSlim, and optionally releases the managed resources.
Public methodSupported by Portable Class LibrarySupported in .NET for Windows Store appsEquals(Object)Determines whether the specified object is equal to the current object. (Inherited from Object.)
Protected methodSupported by Portable Class LibrarySupported in .NET for Windows Store appsFinalizeAllows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection. (Inherited from Object.)
Public methodSupported by Portable Class LibrarySupported in .NET for Windows Store appsGetHashCodeServes as the default hash function. (Inherited from Object.)
Public methodSupported by Portable Class LibrarySupported in .NET for Windows Store appsGetTypeGets the Type of the current instance. (Inherited from Object.)
Protected methodSupported by Portable Class LibrarySupported in .NET for Windows Store appsMemberwiseCloneCreates a shallow copy of the current Object. (Inherited from Object.)
Public methodSupported by Portable Class LibrarySupported in .NET for Windows Store appsReleaseExits the SemaphoreSlim once.
Public methodSupported by Portable Class LibrarySupported in .NET for Windows Store appsRelease(Int32)Exits the SemaphoreSlim a specified number of times.
Public methodSupported by Portable Class LibrarySupported in .NET for Windows Store appsToStringReturns a string that represents the current object. (Inherited from Object.)
Public methodSupported by Portable Class LibrarySupported in .NET for Windows Store appsWaitBlocks the current thread until it can enter the SemaphoreSlim.
Public methodSupported by Portable Class LibrarySupported in .NET for Windows Store appsWait(CancellationToken)Blocks the current thread until it can enter the SemaphoreSlim, while observing a CancellationToken.
Public methodSupported by Portable Class LibrarySupported in .NET for Windows Store appsWait(Int32)Blocks the current thread until it can enter the SemaphoreSlim, using a 32-bit signed integer that specifies the timeout.
Public methodSupported by Portable Class LibrarySupported in .NET for Windows Store appsWait(TimeSpan)Blocks the current thread until it can enter the SemaphoreSlim, using a TimeSpan to specify the timeout.
Public methodSupported by Portable Class LibrarySupported in .NET for Windows Store appsWait(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 methodSupported by Portable Class LibrarySupported in .NET for Windows Store appsWait(TimeSpan, CancellationToken)Blocks the current thread until it can enter the SemaphoreSlim, using a TimeSpan that specifies the timeout, while observing a CancellationToken.
Public methodSupported in .NET for Windows Store appsWaitAsyncAsynchronously waits to enter the SemaphoreSlim.
Public methodSupported in .NET for Windows Store appsWaitAsync(CancellationToken)Asynchronously waits to enter the SemaphoreSlim, while observing a CancellationToken.
Public methodSupported in .NET for Windows Store appsWaitAsync(Int32)Asynchronously waits to enter the SemaphoreSlim, using a 32-bit signed integer to measure the time interval.
Public methodSupported in .NET for Windows Store appsWaitAsync(TimeSpan)Asynchronously waits to enter the SemaphoreSlim, using a TimeSpan to measure the time interval.
Public methodSupported in .NET for Windows Store appsWaitAsync(Int32, CancellationToken)Asynchronously waits to enter the SemaphoreSlim, using a 32-bit signed integer to measure the time interval, while observing a CancellationToken.
Public methodSupported in .NET for Windows Store appsWaitAsync(TimeSpan, CancellationToken)Asynchronously waits to enter the SemaphoreSlim, using a TimeSpan to measure the time interval, while observing a CancellationToken.
Top

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

NoteNote

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:

Imports System.Threading
Imports System.Threading.Tasks


Module SemaphoreSlimSample

    ' Demonstrates: 
    ' SemaphoreSlim construction 
    ' SemaphoreSlim.Wait() 
    ' SemaphoreSlim.Release() 
    ' SemaphoreSlim.AvailableWaitHandle 
    Sub Main()
        Dim ss As 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 
        Dim t1 As Task = Task.Factory.StartNew(
            Sub()
                Thread.Sleep(100)
                Console.WriteLine("Task about to release SemaphoreSlim")
                ss.Release()
            End Sub)

        ' 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()
    End Sub 

End Module

.NET Framework

Supported in: 4.5.2, 4.5.1, 4.5, 4

.NET Framework Client Profile

Supported in: 4

Portable Class Library

Supported in: Portable Class Library

.NET for Windows Store apps

Supported in: Windows 8

.NET for Windows Phone apps

Supported in: Windows Phone 8.1, Windows Phone 8, Silverlight 8.1

Windows Phone 8.1, Windows Phone 8, Windows 8.1, Windows Server 2012 R2, 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.

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.

Show:
© 2014 Microsoft