示例#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);
        }
示例#2
0
        private void OnReceiveMessage(AmqpMessage message)
        {
            if (this.messageListener != null)
            {
                this.messageListener(message);
                return;
            }
            ReceivingAmqpLink.ReceiveAsyncResult value = null;
            int  num  = 0;
            bool flag = false;

            lock (this.syncRoot)
            {
                if (this.waiterList != null && this.waiterList.Count > 0)
                {
                    value = this.waiterList.First.Value;
                    this.waiterList.RemoveFirst();
                    value.OnRemoved();
                    num = (base.Settings.AutoSendFlow ? 0 : this.GetOnDemandReceiveCredit());
                }
                else if (!base.Settings.AutoSendFlow && base.Settings.SettleType != SettleMode.SettleOnSend)
                {
                    flag = true;
                }
                else if (this.messageQueue != null)
                {
                    this.messageQueue.Enqueue(message);
                }
            }
            if (flag)
            {
                this.ReleaseMessage(message);
                message.Dispose();
            }
            if (num > 0)
            {
                base.IssueCredit((uint)num, false, AmqpConstants.NullBinary);
            }
            if (value != null)
            {
                Action <object> action = (object o) => {
                    Tuple <ReceivingAmqpLink.ReceiveAsyncResult, IEnumerable <AmqpMessage> > tuple = (Tuple <ReceivingAmqpLink.ReceiveAsyncResult, IEnumerable <AmqpMessage> >)o;
                    tuple.Item1.Signal(tuple.Item2, false);
                };
                AmqpMessage[] amqpMessageArray = new AmqpMessage[] { message };
                ActionItem.Schedule(action, new Tuple <ReceivingAmqpLink.ReceiveAsyncResult, IEnumerable <AmqpMessage> >(value, amqpMessageArray));
            }
        }
示例#3
0
 private static void OnTimer(object state)
 {
     ReceivingAmqpLink.ReceiveAsyncResult receiveAsyncResult = (ReceivingAmqpLink.ReceiveAsyncResult)state;
     lock (receiveAsyncResult.parent.syncRoot)
     {
         if (receiveAsyncResult.parent.waiterList == null || receiveAsyncResult.node == null)
         {
             return;
         }
         else
         {
             receiveAsyncResult.parent.waiterList.Remove(receiveAsyncResult.node);
             receiveAsyncResult.node = null;
         }
     }
     receiveAsyncResult.CompleteInternal(null, false, 2, null);
 }
示例#4
0
 public static bool End(IAsyncResult result, out IEnumerable <AmqpMessage> messages)
 {
     ReceivingAmqpLink.ReceiveAsyncResult receiveAsyncResult = AsyncResult.End <ReceivingAmqpLink.ReceiveAsyncResult>(result);
     messages = receiveAsyncResult.messages;
     return(receiveAsyncResult.completed == 1);
 }