public async Task <IDisposable> LockAsync(TKey key) { SemaphoreHolder holder; lock (_lock) { if (!_semaphores.TryGetValue(key, out holder)) { holder = new SemaphoreHolder(key); holder.Released += Holder_Released; _semaphores[key] = holder; } holder.EnqueueAwaiter(); } await holder.WaitAsync(); return(new LockHolder(holder)); }
public LockHolder(SemaphoreHolder holder) { _holder = holder; }