diff --git a/src/libraries/System.IO.Pipelines/src/System/IO/Pipelines/Pipe.cs b/src/libraries/System.IO.Pipelines/src/System/IO/Pipelines/Pipe.cs index 14f0092125ad4e4aa4533a2625ac4e4156b8c43f..bea628978e43d4b2cabfabb0022dee325d72c94b 100644 --- a/src/libraries/System.IO.Pipelines/src/System/IO/Pipelines/Pipe.cs +++ b/src/libraries/System.IO.Pipelines/src/System/IO/Pipelines/Pipe.cs @@ -664,6 +664,11 @@ internal ValueTask ReadAtLeastAsync(int minimumBytes, CancellationTo ThrowHelper.ThrowInvalidOperationException_NoReadingAllowed(); } + if (token.IsCancellationRequested) + { + return new ValueTask(Task.FromCanceled(token)); + } + CompletionData completionData = default; ValueTask result; lock (SyncObj) @@ -715,6 +720,11 @@ internal ValueTask ReadAsync(CancellationToken token) ThrowHelper.ThrowInvalidOperationException_NoReadingAllowed(); } + if (token.IsCancellationRequested) + { + return new ValueTask(Task.FromCanceled(token)); + } + ValueTask result; lock (SyncObj) { diff --git a/src/libraries/System.IO.Pipelines/src/System/IO/Pipelines/StreamPipeReader.cs b/src/libraries/System.IO.Pipelines/src/System/IO/Pipelines/StreamPipeReader.cs index ccafce223673293a28d8d8200d03bdf9c484274e..7b33539b540b333a8cdad0ede2f4b54a2a2fc9cc 100644 --- a/src/libraries/System.IO.Pipelines/src/System/IO/Pipelines/StreamPipeReader.cs +++ b/src/libraries/System.IO.Pipelines/src/System/IO/Pipelines/StreamPipeReader.cs @@ -194,7 +194,10 @@ public override ValueTask ReadAsync(CancellationToken cancellationTo // TODO ReadyAsync needs to throw if there are overlapping reads. ThrowIfCompleted(); - cancellationToken.ThrowIfCancellationRequested(); + if (cancellationToken.IsCancellationRequested) + { + return new ValueTask(Task.FromCanceled(cancellationToken)); + } // PERF: store InternalTokenSource locally to avoid querying it twice (which acquires a lock) CancellationTokenSource tokenSource = InternalTokenSource; @@ -273,7 +276,10 @@ protected override ValueTask ReadAtLeastAsyncCore(int minimumSize, C // TODO ReadyAsync needs to throw if there are overlapping reads. ThrowIfCompleted(); - cancellationToken.ThrowIfCancellationRequested(); + if (cancellationToken.IsCancellationRequested) + { + return new ValueTask(Task.FromCanceled(cancellationToken)); + } // PERF: store InternalTokenSource locally to avoid querying it twice (which acquires a lock) CancellationTokenSource tokenSource = InternalTokenSource; diff --git a/src/libraries/System.IO.Pipelines/tests/PipeReaderCopyToAsyncTests.cs b/src/libraries/System.IO.Pipelines/tests/PipeReaderCopyToAsyncTests.cs index 2076d4ea66e153c8cb9c5807590f9070241dbccb..e58e5af4e70598943fe95a2a77d44ff52487b77f 100644 --- a/src/libraries/System.IO.Pipelines/tests/PipeReaderCopyToAsyncTests.cs +++ b/src/libraries/System.IO.Pipelines/tests/PipeReaderCopyToAsyncTests.cs @@ -178,7 +178,7 @@ public async Task CancelingBetweenReadsThrowsOperationCancelledException() Pipe.Writer.WriteEmpty(10); await Pipe.Writer.FlushAsync(); - await Assert.ThrowsAsync(() => task); + await Assert.ThrowsAsync(() => task); } [Fact] diff --git a/src/libraries/System.IO.Pipelines/tests/PipeReaderReadAtLeastAsyncTests.cs b/src/libraries/System.IO.Pipelines/tests/PipeReaderReadAtLeastAsyncTests.cs index c2aaea3c29993a74d78bbaa8c46194b444623ef2..c12d3b88253cfa6942ba604aa34d182371be355c 100644 --- a/src/libraries/System.IO.Pipelines/tests/PipeReaderReadAtLeastAsyncTests.cs +++ b/src/libraries/System.IO.Pipelines/tests/PipeReaderReadAtLeastAsyncTests.cs @@ -141,7 +141,8 @@ public async Task CanReadAtLeast(int bufferSize, bool bufferedRead) [Fact] public Task ReadAtLeastAsyncThrowsIfPassedCanceledCancellationToken() { - return Assert.ThrowsAsync(async () => await PipeReader.ReadAtLeastAsync(0, new CancellationToken(true))); + ValueTask task = PipeReader.ReadAtLeastAsync(0, new CancellationToken(canceled: true)); + return Assert.ThrowsAsync(async () => await task); } [Fact] diff --git a/src/libraries/System.IO.Pipelines/tests/ReadAsyncCancellationTests.cs b/src/libraries/System.IO.Pipelines/tests/ReadAsyncCancellationTests.cs index 0e9fe23999d82ba7fc4e36a5dbf46f80e4cda50b..8422de307358454bad484ed4d7e7e2219fd8bddd 100644 --- a/src/libraries/System.IO.Pipelines/tests/ReadAsyncCancellationTests.cs +++ b/src/libraries/System.IO.Pipelines/tests/ReadAsyncCancellationTests.cs @@ -362,12 +362,10 @@ public void ReadAsyncReturnsIsCancelOnCancelPendingReadBeforeGetResult() } [Fact] - public void ReadAsyncThrowsIfPassedCanceledCancellationToken() + public Task ReadAsyncThrowsIfPassedCanceledCancellationToken() { - var cancellationTokenSource = new CancellationTokenSource(); - cancellationTokenSource.Cancel(); - - Assert.Throws(() => Pipe.Reader.ReadAsync(cancellationTokenSource.Token)); + ValueTask task = Pipe.Reader.ReadAsync(new CancellationToken(canceled: true)); + return Assert.ThrowsAsync(async () => await task); } [Fact]