in src/Microsoft.Azure.Relay/Common/InputQueue.cs [59:94]
public Task<T> DequeueAsync(CancellationToken cancellationToken, object state)
{
Item item = default(Item);
lock (ThisLock)
{
if (queueState == QueueState.Open)
{
if (itemQueue.HasAvailableItem)
{
item = itemQueue.DequeueAvailableItem();
}
else
{
var reader = new AsyncQueueReader(this, cancellationToken, state);
readerQueue.Enqueue(reader);
return reader.Task;
}
}
else if (queueState == QueueState.Shutdown)
{
if (itemQueue.HasAvailableItem)
{
item = itemQueue.DequeueAvailableItem();
}
else if (itemQueue.HasAnyItem)
{
AsyncQueueReader reader = new AsyncQueueReader(this, cancellationToken, state);
readerQueue.Enqueue(reader);
return reader.Task;
}
}
}
InvokeDequeuedCallback(item.DequeuedCallback);
return Task.FromResult(item.GetValue());
}