<PackageReference Include="NETStandard.Library" Version="2.0.0-preview2-25401-01" />

System.Threading.SemaphoreSlim

public class SemaphoreSlim : IDisposable
namespace System.Threading { public class SemaphoreSlim : IDisposable { public WaitHandle AvailableWaitHandle { get; } public int CurrentCount { get; } public SemaphoreSlim(int initialCount); public SemaphoreSlim(int initialCount, int maxCount); public void Dispose(); protected virtual void Dispose(bool disposing); public int Release(); public int Release(int releaseCount); public void Wait(); public bool Wait(int millisecondsTimeout); public bool Wait(int millisecondsTimeout, CancellationToken cancellationToken); public void Wait(CancellationToken cancellationToken); public bool Wait(TimeSpan timeout); public bool Wait(TimeSpan timeout, CancellationToken cancellationToken); public Task WaitAsync(); public Task<bool> WaitAsync(int millisecondsTimeout); public Task<bool> WaitAsync(int millisecondsTimeout, CancellationToken cancellationToken); public Task WaitAsync(CancellationToken cancellationToken); public Task<bool> WaitAsync(TimeSpan timeout); public Task<bool> WaitAsync(TimeSpan timeout, CancellationToken cancellationToken); } }