Esempio n. 1
0
        // 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);
        }
Esempio n. 2
0
        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();
            }
        }