Exemple #1
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));
            }
        }