diff --git a/contributing.md b/contributing.md index c74dc15..b9e99d2 100644 --- a/contributing.md +++ b/contributing.md @@ -225,7 +225,8 @@ static partial class Polyfill return Task.FromCanceled(cancellationToken); } - return target.FlushAsync(); + return target.FlushAsync() + .WaitAsync(cancellationToken); } #endif @@ -283,7 +284,8 @@ static partial class Polyfill await target.WriteAsync(chunk, cancel).ConfigureAwait(false); } #else - await target.WriteAsync(builder.ToString()); + await target.WriteAsync(builder.ToString()) + .WaitAsync(cancellationToken); #endif } } @@ -315,7 +317,9 @@ static partial class Polyfill segment = new(buffer.ToArray()); } - return new(target.WriteAsync(segment.Array!, segment.Offset, segment.Count)); + var task = target.WriteAsync(segment.Array!, segment.Offset, segment.Count) + .WaitAsync(cancellationToken); + return new(task); } /// @@ -341,7 +345,9 @@ static partial class Polyfill segment = new(buffer.ToArray()); } - return new(target.WriteLineAsync(segment.Array!, segment.Offset, segment.Count)); + var task = target.WriteLineAsync(segment.Array!, segment.Offset, segment.Count) + .WaitAsync(cancellationToken); + return new(task); } #endif @@ -394,7 +400,7 @@ static partial class Polyfill #endif } ``` -snippet source | anchor +snippet source | anchor @@ -429,9 +435,18 @@ partial class PolyfillTests var read = await reader.ReadToEndAsync(Cancel.None); Assert.AreEqual("value", read); } + + [Test] + public async Task StreamReaderReadLineAsync() + { + using var stream = new MemoryStream("line1\nline2"u8.ToArray()); + using var reader = new StreamReader(stream); + var read = await reader.ReadLineAsync(CancellationToken.None); + Assert.AreEqual("line1", read); + } } ``` -snippet source | anchor +snippet source | anchor diff --git a/src/Directory.Build.props b/src/Directory.Build.props index ea24f92..99c0202 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -1,7 +1,7 @@ - 6.9.0 + 6.10.0 1.0.0 Polyfill true diff --git a/src/Polyfill/Polyfill_HttpClient.cs b/src/Polyfill/Polyfill_HttpClient.cs index 12f111b..4a780f2 100644 --- a/src/Polyfill/Polyfill_HttpClient.cs +++ b/src/Polyfill/Polyfill_HttpClient.cs @@ -89,12 +89,14 @@ public static async Task GetByteArrayAsync( using var response = await target.GetAsync( requestUri, HttpCompletionOption.ResponseHeadersRead, - cancellationToken - ).ConfigureAwait(false); + cancellationToken) + .ConfigureAwait(false); response.EnsureSuccessStatusCode(); - return await response.Content.ReadAsByteArrayAsync(cancellationToken).ConfigureAwait(false); + return await response.Content + .ReadAsByteArrayAsync(cancellationToken) + .ConfigureAwait(false); } // Older versions of HttpClient methods don't propagate the cancellation token inside the exception catch (OperationCanceledException exception) when ( @@ -143,12 +145,14 @@ public static async Task GetStringAsync( using var response = await target.GetAsync( requestUri, HttpCompletionOption.ResponseHeadersRead, - cancellationToken - ).ConfigureAwait(false); + cancellationToken) + .ConfigureAwait(false); response.EnsureSuccessStatusCode(); - return await response.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false); + return await response.Content + .ReadAsStringAsync(cancellationToken) + .ConfigureAwait(false); } // Older versions of HttpClient methods don't propagate the cancellation token inside the exception catch (OperationCanceledException exception) when ( diff --git a/src/Polyfill/Polyfill_HttpContent.cs b/src/Polyfill/Polyfill_HttpContent.cs index 91a8a2d..c2f2fc9 100644 --- a/src/Polyfill/Polyfill_HttpContent.cs +++ b/src/Polyfill/Polyfill_HttpContent.cs @@ -29,7 +29,8 @@ public static Task ReadAsStreamAsync( CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); - return target.ReadAsStreamAsync(); + return target.ReadAsStreamAsync() + .WaitAsync(cancellationToken); } /// @@ -49,7 +50,8 @@ public static Task ReadAsByteArrayAsync( CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); - return target.ReadAsByteArrayAsync(); + return target.ReadAsByteArrayAsync() + .WaitAsync(cancellationToken); } /// @@ -69,7 +71,8 @@ public static Task ReadAsStringAsync( CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); - return target.ReadAsStringAsync(); + return target.ReadAsStringAsync() + .WaitAsync(cancellationToken); } } #endif \ No newline at end of file diff --git a/src/Polyfill/Polyfill_Stream.cs b/src/Polyfill/Polyfill_Stream.cs index 2852937..1d65f0a 100644 --- a/src/Polyfill/Polyfill_Stream.cs +++ b/src/Polyfill/Polyfill_Stream.cs @@ -40,7 +40,8 @@ public static ValueTask ReadAsync( segment = new(buffer.ToArray()); } - return new(target.ReadAsync(segment.Array!, segment.Offset, segment.Count, cancellationToken)); + var task = target.ReadAsync(segment.Array!, segment.Offset, segment.Count, cancellationToken); + return new(task); } /// @@ -63,7 +64,8 @@ public static ValueTask WriteAsync( segment = new(buffer.ToArray()); } - return new(target.WriteAsync(segment.Array!, segment.Offset, segment.Count, cancellationToken)); + var task = target.WriteAsync(segment.Array!, segment.Offset, segment.Count, cancellationToken); + return new(task); } #endif diff --git a/src/Polyfill/Polyfill_TextReader.cs b/src/Polyfill/Polyfill_TextReader.cs index ac35bc7..a42ce14 100644 --- a/src/Polyfill/Polyfill_TextReader.cs +++ b/src/Polyfill/Polyfill_TextReader.cs @@ -41,7 +41,9 @@ public static ValueTask ReadAsync( segment = new(buffer.ToArray()); } - return new(target.ReadAsync(segment.Array!, segment.Offset, segment.Count)); + var task = target.ReadAsync(segment.Array!, segment.Offset, segment.Count) + .WaitAsync(cancellationToken); + return new(task); } #endif @@ -62,7 +64,8 @@ public static Task ReadToEndAsync( { cancellationToken.ThrowIfCancellationRequested(); - return target.ReadToEndAsync(); + return target.ReadToEndAsync() + .WaitAsync(cancellationToken); } /// @@ -81,7 +84,8 @@ public static Task ReadLineAsync( { cancellationToken.ThrowIfCancellationRequested(); - return target.ReadLineAsync(); + return target.ReadLineAsync() + .WaitAsync(cancellationToken); } #endif } \ No newline at end of file diff --git a/src/Polyfill/Polyfill_TextWriter.cs b/src/Polyfill/Polyfill_TextWriter.cs index 2890687..68d3b6a 100644 --- a/src/Polyfill/Polyfill_TextWriter.cs +++ b/src/Polyfill/Polyfill_TextWriter.cs @@ -37,7 +37,8 @@ public static Task FlushAsync(this TextWriter target, CancellationToken cancella return Task.FromCanceled(cancellationToken); } - return target.FlushAsync(); + return target.FlushAsync() + .WaitAsync(cancellationToken); } #endif @@ -95,7 +96,8 @@ async Task WriteAsyncCore(StringBuilder builder, CancellationToken cancel) await target.WriteAsync(chunk, cancel).ConfigureAwait(false); } #else - await target.WriteAsync(builder.ToString()); + await target.WriteAsync(builder.ToString()) + .WaitAsync(cancellationToken); #endif } } @@ -127,7 +129,9 @@ public static ValueTask WriteAsync( segment = new(buffer.ToArray()); } - return new(target.WriteAsync(segment.Array!, segment.Offset, segment.Count)); + var task = target.WriteAsync(segment.Array!, segment.Offset, segment.Count) + .WaitAsync(cancellationToken); + return new(task); } /// @@ -153,7 +157,9 @@ public static ValueTask WriteLineAsync( segment = new(buffer.ToArray()); } - return new(target.WriteLineAsync(segment.Array!, segment.Offset, segment.Count)); + var task = target.WriteLineAsync(segment.Array!, segment.Offset, segment.Count) + .WaitAsync(cancellationToken); + return new(task); } #endif diff --git a/src/Tests/PolyfillTests_StreamReader.cs b/src/Tests/PolyfillTests_StreamReader.cs index 9d48342..16cb3f3 100644 --- a/src/Tests/PolyfillTests_StreamReader.cs +++ b/src/Tests/PolyfillTests_StreamReader.cs @@ -20,4 +20,13 @@ public async Task StreamReaderReadToEndAsync() var read = await reader.ReadToEndAsync(Cancel.None); Assert.AreEqual("value", read); } + + [Test] + public async Task StreamReaderReadLineAsync() + { + using var stream = new MemoryStream("line1\nline2"u8.ToArray()); + using var reader = new StreamReader(stream); + var read = await reader.ReadLineAsync(CancellationToken.None); + Assert.AreEqual("line1", read); + } }