// This does not block, however, Dispatch() must be called later if this function returns true. private bool enqueueWithoutDispatch(ExItem <T> item) { lock (LockObject) { if (_QueueState == QueueState.Open) { if (_QueueReader.Count == 0) { _ItemQueue.EnqueueAvailableItem(item); return(false); } else { _ItemQueue.EnqueuePendingItem(item); return(true); } } } invokeDequeueCallback(item.Callback); item.Dispose(); return(false); }
private void enqueueAndDispatch(ExItem <T> item, bool canDispatchOnThisThread) { bool disposeItem = false; bool dispatchLater = false; bool itemAvailable = true; IQueueReader <T> reader = null; IQueueWaiter[] waiters = null; lock (LockObject) { itemAvailable = (_QueueState != QueueState.Closed && _QueueState != QueueState.Shutdown); this.getWaiters(out waiters); if (_QueueState == QueueState.Open) { if (canDispatchOnThisThread) { if (_QueueReader.Count == 0) { _ItemQueue.EnqueueAvailableItem(item); } else { reader = _QueueReader.Dequeue(); } } else { if (_QueueReader.Count == 0) { _ItemQueue.EnqueueAvailableItem(item); } else { _ItemQueue.EnqueuePendingItem(item); dispatchLater = true; } } } else { disposeItem = true; } } if (waiters != null) { if (canDispatchOnThisThread) { completeWaiters(itemAvailable, waiters); } else { completeWaitersLater(itemAvailable, waiters); } } if (reader != null) { invokeDequeueCallback(item.Callback); reader.Set(item); } if (dispatchLater) { if (_OnDispatchCallback == null) { _OnDispatchCallback = onDispatchCallback; } ThreadPool.QueueUserWorkItem(_OnDispatchCallback, this); } else if (disposeItem) { invokeDequeueCallback(item.Callback); item.Dispose(); } }