<PackageReference Include="Nito.AsyncEx.Coordination" Version="1.0.2" />

Nito.AsyncEx.AsyncLock

public sealed class AsyncLock
A mutual exclusion lock that is compatible with async. Note that this lock is not recursive!
namespace Nito.AsyncEx { public sealed class AsyncLock { public int Id { get; } public AsyncLock(); public AsyncLock(IAsyncWaitQueue<IDisposable> queue); public AwaitableDisposable<IDisposable> LockAsync(CancellationToken cancellationToken); public AwaitableDisposable<IDisposable> LockAsync(); public IDisposable Lock(CancellationToken cancellationToken); public IDisposable Lock(); } }