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(); }