Ejemplo n.º 1
0
 public bool TryEnter()
 {
     //nao há em espera e é possivel entrar
     if (waitingCount == 0 && TryAcquire())
     {
         return(true);
     }
     lock (myLock)
     {
         // se a espera estiver cheia desiste
         if (waitingCount == maxWaiting)
         {
             return(false);
         }
         // a partir daqui passa a estar em espera
         waitingCount += 1;
         // verificar se já é possivel entrar
         if (waitingCount == 1 && TryAcquire())
         {
             waitingCount -= 1;
             return(true);
         }
         // adiciono em espera
         LinkedListNode <bool> node = waitingQueue.AddLast(false);
         int timeout  = waitTimeout;
         int lastTime = (timeout != Timeout.Infinite) ? Environment.TickCount : 0;
         do
         {
             try
             {
                 SyncUtils.Wait(myLock, node, timeout);
             }
             catch (ThreadInterruptedException e)
             {
                 // ocorreu exceção, desito da espera
                 waitingCount -= 1;
                 waitingQueue.Remove(node);
                 if (node.Value)
                 {
                     Thread.CurrentThread.Interrupt();
                     return(true);
                 }
                 throw;
             }
             if (node.Value)
             {
                 return(true);
             }
             if (SyncUtils.AdjustTimeout(ref lastTime, ref timeout) == 0)
             {
                 waitingCount -= 1;
                 waitingQueue.Remove(node);
                 return(false);
             }
         } while (true);
     }
 }