diff --git a/src/libraries/System.Threading.Channels/src/System/Threading/Channels/SingleConsumerUnboundedChannel.cs b/src/libraries/System.Threading.Channels/src/System/Threading/Channels/SingleConsumerUnboundedChannel.cs index 969249384ac1de..ddc3e7b11f25f1 100644 --- a/src/libraries/System.Threading.Channels/src/System/Threading/Channels/SingleConsumerUnboundedChannel.cs +++ b/src/libraries/System.Threading.Channels/src/System/Threading/Channels/SingleConsumerUnboundedChannel.cs @@ -254,8 +254,7 @@ public override bool TryComplete(Exception? error) // Complete a blocked reader if necessary if (blockedReader is not null) { - error = ChannelUtilities.CreateInvalidCompletionException(error); - blockedReader.TrySetException(error); + blockedReader.TrySetException(ChannelUtilities.CreateInvalidCompletionException(error)); } // Complete a waiting reader if necessary. (We really shouldn't have both a blockedReader diff --git a/src/libraries/System.Threading.Channels/tests/UnboundedChannelTests.cs b/src/libraries/System.Threading.Channels/tests/UnboundedChannelTests.cs index 3ca8cc5741e886..ae5cccb05a73ac 100644 --- a/src/libraries/System.Threading.Channels/tests/UnboundedChannelTests.cs +++ b/src/libraries/System.Threading.Channels/tests/UnboundedChannelTests.cs @@ -242,6 +242,23 @@ public async Task MultipleReaders_CancelsPreviousReader() Assert.Equal(42, await t2); } + [Fact] + public async Task WaitToReadAsync_ReturnsFalse_WhenReadAsyncWasCanceledAndChannelCompleted() + { + Channel c = CreateChannel(); + + using var cts = new CancellationTokenSource(); + ValueTask readTask = c.Reader.ReadAsync(cts.Token); + cts.Cancel(); + await Assert.ThrowsAnyAsync(async () => await readTask); + + ValueTask waitTask = c.Reader.WaitToReadAsync(CancellationToken.None); + + c.Writer.Complete(); + + Assert.False(await waitTask); + } + [ConditionalFact(typeof(PlatformDetection), nameof(PlatformDetection.IsMultithreadingSupported))] public void Stress_TryWrite_TryRead() {