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