Exemplo n.º 1
0
        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);
            }
        }
Exemplo n.º 2
0
        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));
        }