public Task DequeueAsync()

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