private static void TimerCallback(object state)
        {
            AsyncQueueReader <T> thisPtr = (AsyncQueueReader <T>)state;

            if (thisPtr._InputQueue.RemoveReader(thisPtr))
            {
                thisPtr._Expired = true;
                thisPtr.Complete(false);
            }
        }
Beispiel #2
0
        public bool EndDequeue(IAsyncResult result, out T value)
        {
            DataCompleteAsyncResult <T> dataResult = result as DataCompleteAsyncResult <T>;

            if (dataResult != null)
            {
                value = DataCompleteAsyncResult <T> .End(result);

                return(true);
            }
            return(AsyncQueueReader <T> .End(result, out value));
        }
        public static bool End(IAsyncResult asyncResult, out T value)
        {
            AsyncQueueReader <T> readerResult = ExAsyncResult.End <AsyncQueueReader <T> >(asyncResult);

            if (readerResult._Expired)
            {
                value = default(T);
                return(false);
            }
            else
            {
                value = readerResult._Item;
                return(true);
            }
        }
Beispiel #4
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));
        }