private ReceiveInternal ( MessageCallback callback, int timeout = 60000 ) : Amqp.Message | ||
callback | MessageCallback | |
timeout | int | |
return | Amqp.Message |
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);
}
/// <summary> /// Receives a message asynchronously. /// </summary> /// <param name="receiver">The link.</param> /// <param name="timeout">The timeout in seconds.</param> /// <returns></returns> public static Task <Message> ReceiveAsync(this ReceiverLink receiver, int timeout = 60000) { TaskCompletionSource <Message> tcs = new TaskCompletionSource <Message>(); try { var message = receiver.ReceiveInternal( (l, m) => tcs.SetResult(m), timeout); if (message != null) { tcs.SetResult(message); } } catch (Exception exception) { tcs.SetException(exception); } return(tcs.Task); }