public IAsyncResult BeginEnter(TimeSpan timeout, AsyncCallback callback, object state)
        {
            AsyncSemaphore.SemaphoreWaiter semaphoreWaiter;
            bool flag;

            lock (this.SyncRoot)
            {
                if (this.count <= 0)
                {
                    flag            = false;
                    semaphoreWaiter = new AsyncSemaphore.SemaphoreWaiter(this, timeout, callback, state);
                    semaphoreWaiter.StartTimer(this.waiters.AddLast(semaphoreWaiter));
                }
                else
                {
                    flag = true;
                    AsyncSemaphore asyncSemaphore = this;
                    asyncSemaphore.count = asyncSemaphore.count - 1;
                    semaphoreWaiter      = new AsyncSemaphore.SemaphoreWaiter(this, TimeSpan.MaxValue, callback, state);
                }
            }
            if (flag)
            {
                semaphoreWaiter.Signal(true, true);
            }
            return(semaphoreWaiter);
        }
 public void Exit()
 {
     AsyncSemaphore.SemaphoreWaiter value = null;
     lock (this.SyncRoot)
     {
         if (this.count == this.maximumCount)
         {
             throw new SemaphoreFullException(SRCore.AsyncSemaphoreExitCalledWithoutEnter);
         }
         if (this.waiters.Count <= 0)
         {
             AsyncSemaphore asyncSemaphore = this;
             asyncSemaphore.count = asyncSemaphore.count + 1;
         }
         else
         {
             LinkedListNode <AsyncSemaphore.SemaphoreWaiter> first = this.waiters.First;
             this.waiters.Remove(first);
             value = first.Value;
         }
     }
     if (value != null)
     {
         value.Signal(false, true);
     }
 }
        private void HandleTimeout(AsyncSemaphore.SemaphoreWaiter waiter)
        {
            bool flag = false;

            lock (this.SyncRoot)
            {
                if (waiter.Node.List != null)
                {
                    flag = true;
                    this.waiters.Remove(waiter.Node);
                }
            }
            if (flag)
            {
                waiter.Signal(false, false);
            }
        }