示例#1
0
        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);
        }