in src/ReceiverLink.cs [487:530]
internal Message ReceiveInternal(MessageCallback callback, int timeout = 60000)
{
Waiter waiter = null;
lock (this.ThisLock)
{
this.ThrowIfDetaching("Receive");
MessageNode first = (MessageNode)this.receivedMessages.First;
if (first != null)
{
this.receivedMessages.Remove(first);
return first.Message;
}
if (timeout != 0)
{
#if NETFX || NETFX40 || DOTNET || NETFX_CORE || WINDOWS_STORE || WINDOWS_PHONE
waiter = callback == null ? (Waiter)new SyncWaiter() : new AsyncWaiter(this, callback);
#else
waiter = new SyncWaiter();
#endif
this.waiterList.Add(waiter);
}
}
// send credit after waiter creation to avoid race condition
if (this.totalCredit < 0)
{
this.SetCredit(DefaultCredit, true);
}
if (timeout == 0)
{
return null;
}
Message message = null;
message = waiter.Wait(timeout);
if (this.Error != null)
{
throw new AmqpException(this.Error);
}
return message;
}