public bool Dequeue(TimeSpan timeout, out T value) { WaitQueueReader <T> reader = null; ExItem <T> item = new ExItem <T>(); lock (LockObject) { if (_QueueState == QueueState.Open) { if (_ItemQueue.HasAvailableItem) { item = _ItemQueue.DequeueAvailableItem(); } else { reader = new WaitQueueReader <T>(this); _QueueReader.Enqueue(reader); } } else if (_QueueState == QueueState.Shutdown) { if (_ItemQueue.HasAvailableItem) { item = _ItemQueue.DequeueAvailableItem(); } else if (_ItemQueue.HasAnyItem) { reader = new WaitQueueReader <T>(this); _QueueReader.Enqueue(reader); } else { value = default(T); return(true); } } else { value = default(T); return(true); } } if (reader != null) { return(reader.Wait(timeout, out value)); } else { invokeDequeueCallback(item.Callback); value = item.GetData(); return(true); } }
public IAsyncResult BeginDequeue(TimeSpan timeout, AsyncCallback callback, object state) { ExItem <T> item = default(ExItem <T>); lock (LockObject) { if (_QueueState == QueueState.Open) { if (_ItemQueue.HasAvailableItem) { item = _ItemQueue.DequeueAvailableItem(); } else { AsyncQueueReader <T> reader = new AsyncQueueReader <T>(this, timeout, callback, state); _QueueReader.Enqueue(reader); return(reader); } } else if (_QueueState == QueueState.Shutdown) { if (_ItemQueue.HasAvailableItem) { item = _ItemQueue.DequeueAvailableItem(); } else if (_ItemQueue.HasAnyItem) { AsyncQueueReader <T> reader = new AsyncQueueReader <T>(this, timeout, callback, state); _QueueReader.Enqueue(reader); return(reader); } } } invokeDequeueCallback(item.Callback); return(new DataCompleteAsyncResult <T>(item.GetData(), callback, state)); }