Beispiel #1
0
        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));
        }
Beispiel #2
0
 public LockHolder(SemaphoreHolder holder)
 {
     _holder = holder;
 }