bool InternalAdd(Message message, bool isLast, TimeSpan timeout, object state, out MessageAttemptInfo attemptInfo)
        {
            attemptInfo = default(MessageAttemptInfo);

            WaitQueueAdder adder;

            lock (this.ThisLock)
            {
                if (isLast && this.last != 0)
                {
                    throw Fx.AssertAndThrow("Can't add more than one last message.");
                }

                if (!this.IsAddValid())
                {
                    return(false);
                }

                ThrowIfRollover();

                if (CanAdd())
                {
                    attemptInfo = AddToWindow(message, isLast, state);
                    return(true);
                }

                adder = new WaitQueueAdder(this, message, isLast, state);
                this.waitQueue.Enqueue(adder);
            }

            attemptInfo = adder.Wait(timeout);
            return(true);
        }
 private bool InternalAdd(Message message, bool isLast, TimeSpan timeout, object state, out MessageAttemptInfo attemptInfo)
 {
     WaitQueueAdder adder;
     attemptInfo = new MessageAttemptInfo();
     lock (this.ThisLock)
     {
         if (isLast && (this.last != 0L))
         {
             throw Fx.AssertAndThrow("Can't add more than one last message.");
         }
         if (!this.IsAddValid())
         {
             return false;
         }
         this.ThrowIfRollover();
         if (this.CanAdd())
         {
             attemptInfo = this.AddToWindow(message, isLast, state);
             return true;
         }
         adder = new WaitQueueAdder(this, message, isLast, state);
         this.waitQueue.Enqueue(adder);
     }
     attemptInfo = adder.Wait(timeout);
     return true;
 }