using System; using System.Threading; using System.Threading.Tasks; namespace MQTTnet.Internal { public sealed class AsyncLock : IDisposable { private readonly SemaphoreSlim _semaphore = new SemaphoreSlim(1, 1); public Task EnterAsync(CancellationToken cancellationToken) { return _semaphore.WaitAsync(cancellationToken); } public void Exit() { _semaphore.Release(); } public void Dispose() { _semaphore?.Dispose(); } } }