public IAsyncResult BeginReceiveMessages(int messageCount, TimeSpan timeout, AsyncCallback callback, object state) { List <AmqpMessage> amqpMessages = new List <AmqpMessage>(); lock (this.syncRoot) { if (this.messageQueue != null && this.messageQueue.Count > 0) { for (int i = 0; i < messageCount && this.messageQueue.Count > 0; i++) { amqpMessages.Add(this.messageQueue.Dequeue()); } } } if (amqpMessages.Any <AmqpMessage>() || !(timeout > TimeSpan.Zero)) { return(new CompletedAsyncResult <IEnumerable <AmqpMessage> >(amqpMessages, callback, state)); } ReceivingAmqpLink.ReceiveAsyncResult receiveAsyncResult = new ReceivingAmqpLink.ReceiveAsyncResult(this, timeout, callback, state); bool flag = true; lock (this.syncRoot) { if (this.messageQueue != null) { if (this.messageQueue.Count <= 0) { receiveAsyncResult.Initialize(this.waiterList.AddLast(receiveAsyncResult)); flag = false; int num = (base.Settings.AutoSendFlow ? 0 : this.GetOnDemandReceiveCredit()); if (num > 0) { base.IssueCredit((uint)num, false, AmqpConstants.NullBinary); } } else { int num1 = 0; while (num1 < messageCount) { if (this.messageQueue.Count > 0) { amqpMessages.Add(this.messageQueue.Dequeue()); num1++; } else { break; } } } } } if (flag) { receiveAsyncResult.Signal(amqpMessages, true); } return(receiveAsyncResult); }