internal Message ReceiveInternal(MessageCallback callback, int timeout = 60000)
{
this.ThrowIfDetaching("Receive");
if (this.totalCredit < 0)
{
this.SetCredit(DefaultCredit, true);
}
Waiter waiter = null;
lock (this.ThisLock)
{
MessageNode first = (MessageNode)this.receivedMessages.First;
if (first != null)
{
this.receivedMessages.Remove(first);
this.OnDeliverMessage();
return first.Message;
}
if (timeout == 0)
{
return null;
}
#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);
}
return waiter.Wait(timeout);
}