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