internal static bool TryPush(ProducerConsumerQueue <T> target, T item)
 {
     Monitor.Enter(target.SyncRoot);
     try
     {
         if (target.IsAddingCompleted || target.Count == target.BoundedCapacity)
         {
             return(false);
         }
         target.Count++;
         if (target._firstElement == null)
         {
             target._firstElement = target._lastElement = new QueueItem(item);
             target._notEmptyEvent.Set();
         }
         else
         {
             target._firstElement = target._firstElement._precedingElement = new QueueItem(item)
             {
                 _followingElement = target._firstElement
             }
         };
         if (target.Count == target.BoundedCapacity)
         {
             target._notFullEvent.Reset();
         }
     }
     finally { Monitor.Exit(target.SyncRoot); }
     target.RaiseItemAdded(0, item);
     return(true);
 }