public IAsyncResult BeginWaitForItem(TimeSpan timeout, AsyncCallback callback, object state)
        {
            lock (ThisLock)
            {
                if (_queueState == QueueState.Open)
                {
                    if (!_itemQueue.HasAvailableItem)
                    {
                        var waiter = new AsyncQueueWaiter(timeout, callback, state);
                        _waiterList.Add(waiter);
                        return(waiter);
                    }
                }
                else if (_queueState == QueueState.Shutdown)
                {
                    if (!_itemQueue.HasAvailableItem && _itemQueue.HasAnyItem)
                    {
                        var waiter = new AsyncQueueWaiter(timeout, callback, state);
                        _waiterList.Add(waiter);
                        return(waiter);
                    }
                }
            }

            return(new TypedCompletedAsyncResult <bool>(true, callback, state));
        }
        public bool EndWaitForItem(IAsyncResult result)
        {
            var typedResult = result as TypedCompletedAsyncResult <bool>;

            if (typedResult != null)
            {
                return(TypedCompletedAsyncResult <bool> .End(result));
            }

            return(AsyncQueueWaiter.End(result));
        }