public async Task DequeueAsyncCloseError()
        {
            var asyncQueue   = new AsyncQueue <int>();
            var cancellation = new CancellationTokenSource(2000);
            var receiveAsync = asyncQueue.DequeueAsync(cancellation.Token);

            var timeout  = Task.Delay(1000);
            var recvTask = Assert.ThrowsAsync <IOException>(async() =>
            {
                await receiveAsync.ConfigureAwait(false);
            });

            asyncQueue.ClearAndClose(new IOException());

            if (await Task.WhenAny(timeout, recvTask).ConfigureAwait(false) == timeout)
            {
                throw new TimeoutException();
            }

            Assert.Equal(0, asyncQueue.Count);
        }
        public async Task AsyncSendAndClose(int count)
        {
            var cancellation = new CancellationTokenSource(TimeSpan.FromSeconds(5));
            var asyncQueue   = new AsyncQueue <int>();

            var sendValue = 0;
            var sendTask  = new Func <Task>(async() =>
            {
                await Task.Yield();
                while (cancellation.IsCancellationRequested == false)
                {
                    if (asyncQueue.TryEnqueue(sendValue++) == false)
                    {
                        return;
                    }
                    await Task.Delay(10).ConfigureAwait(false);
                }
            })().IgnoreFaultOrCancellation().ConfigureAwait(false);

            await Task.Delay(count);

            asyncQueue.ClearAndClose();

            await sendTask;

            var value     = default(int);
            var actualSum = 0;

            while (asyncQueue.TryDequeue(out value))
            {
                actualSum++;
            }
            var expectedSum = Enumerable.Range(0, sendValue).Sum();

            Assert.NotEqual(expectedSum, actualSum);
            Assert.NotEqual(0, asyncQueue.Count);
            cancellation.Cancel();
        }