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; }