public bool Dequeue(TimeSpan timeout, out T value) { WaitQueueReader reader = null; Item item = new Item(); lock (ThisLock) { if (queueState == QueueState.Open) { if (itemQueue.HasAvailableItem) { item = itemQueue.DequeueAvailableItem(); } else { reader = new WaitQueueReader(this); readerQueue.Enqueue(reader); } } else if (queueState == QueueState.Shutdown) { if (itemQueue.HasAvailableItem) { item = itemQueue.DequeueAvailableItem(); } else if (itemQueue.HasAnyItem) { reader = new WaitQueueReader(this); readerQueue.Enqueue(reader); } else { value = default(T); return(true); } } else { // queueState == QueueState.Closed value = default(T); return(true); } } if (reader != null) { return(reader.Wait(timeout, out value)); } else { InvokeDequeuedCallback(item.DequeuedCallback); value = item.GetValue(); return(true); } }
public async Task <(T result, bool success)> TryDequeueAsync(CancellationToken token) { WaitQueueReader reader = null; Item item = new Item(); lock (ThisLock) { if (_queueState == QueueState.Open) { if (_itemQueue.HasAvailableItem) { item = _itemQueue.DequeueAvailableItem(); } else { reader = new WaitQueueReader(this); _readerQueue.Enqueue(reader); } } else if (_queueState == QueueState.Shutdown) { if (_itemQueue.HasAvailableItem) { item = _itemQueue.DequeueAvailableItem(); } else if (_itemQueue.HasAnyItem) { reader = new WaitQueueReader(this); _readerQueue.Enqueue(reader); } else { return(default(T), true); } } else // queueState == QueueState.Closed { return(default(T), true); } } if (reader != null) { return(await reader.WaitAsync(token)); } else { InvokeDequeuedCallback(item.DequeuedCallback); return(item.GetValue(), true); } }
public async Task <TryAsyncResult <T> > TryDequeueAsync(CancellationToken token) { WaitQueueReader reader = null; Item item = new Item(); lock (ThisLock) { if (queueState == QueueState.Open) { if (itemQueue.HasAvailableItem) { item = itemQueue.DequeueAvailableItem(); } else { reader = new WaitQueueReader(this); readerQueue.Enqueue(reader); } } else if (queueState == QueueState.Shutdown) { if (itemQueue.HasAvailableItem) { item = itemQueue.DequeueAvailableItem(); } else if (itemQueue.HasAnyItem) { reader = new WaitQueueReader(this); readerQueue.Enqueue(reader); } else { return(TryAsyncResult.FromResult(default(T))); } } else // queueState == QueueState.Closed { return(TryAsyncResult.FromResult(default(T))); } } if (reader != null) { return(await reader.WaitAsync(token)); } else { InvokeDequeuedCallback(item.DequeuedCallback); return(TryAsyncResult.FromResult(item.GetValue())); } }
public bool Dequeue(TimeSpan timeout, out T value) { WaitQueueReader <T> reader = null; Item <T> item = new Item <T>(); lock (this.ThisLock) { if (this.queueState == QueueState <T> .Open) { if (this.itemQueue.HasAvailableItem) { item = this.itemQueue.DequeueAvailableItem(); } else { reader = new WaitQueueReader <T>((InputQueue <T>) this); this.readerQueue.Enqueue(reader); } } else if (this.queueState == QueueState <T> .Shutdown) { if (!this.itemQueue.HasAvailableItem) { if (!this.itemQueue.HasAnyItem) { value = default(T); return(true); } reader = new WaitQueueReader <T>((InputQueue <T>) this); this.readerQueue.Enqueue(reader); } else { item = this.itemQueue.DequeueAvailableItem(); } } else { value = default(T); return(true); } } if (reader != null) { return(reader.Wait(timeout, out value)); } InputQueue <T> .InvokeDequeuedCallback(item.DequeuedCallback); value = item.GetValue(); return(true); }