Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add CancellationToken to TextReader.ReadXAsync #61898

Merged
merged 10 commits into from
Jan 25, 2022
Prev Previous commit
Next Next commit
Apply suggestions from code review.
Use helpers for temp files; improve code formatting.

Co-authored-by: Adam Sitnik <adam.sitnik@gmail.com>
  • Loading branch information
bgrainger and adamsitnik authored Jan 21, 2022
commit a915ad3be1722c96ba5a2283bc81a648d3c6a2cb
33 changes: 9 additions & 24 deletions src/libraries/System.IO/tests/StreamReader/StreamReaderTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -131,30 +131,15 @@ public async Task ReadToEndAsync_WithCanceledCancellationToken()
[Fact]
public async Task ReadToEndAsync_WithCancellation()
{
var path = Path.GetTempFileName();
try
{
// create large (~100MB) file
using (var writer = new StreamWriter(path))
{
for (var i = 0; i < 1_000_000; i++)
writer.WriteLine("A very large file used for testing StreamReader cancellation. 0123456789012345678901234567890123456789.");
}

using var reader = File.OpenText(path);
using var cts = new CancellationTokenSource(TimeSpan.FromMilliseconds(50));
await Assert.ThrowsAnyAsync<OperationCanceledException>(async () => await reader.ReadToEndAsync(cts.Token));
}
finally
{
try
{
File.Delete(path);
}
catch (Exception)
{
}
}
string path = GetTestFilePath();

// create large (~100MB) file
File.WriteAllLines(path, Enumerable.Repeat("A very large file used for testing StreamReader cancellation. 0123456789012345678901234567890123456789.", 1_000_000));

using StreamReader reader = File.OpenText(path);
using CancellationTokenSource cts = new (TimeSpan.FromMilliseconds(50));

await Assert.ThrowsAnyAsync<OperationCanceledException>(async () => await reader.ReadToEndAsync(cts.Token));
}

[Fact]
Expand Down
5 changes: 4 additions & 1 deletion src/libraries/System.IO/tests/TextReader/TextReaderTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,10 @@ public async Task ReadToEndAsync_WithCanceledCancellationToken()
using var tr = new CharArrayTextReader(TestDataProvider.LargeData);
using var cts = new CancellationTokenSource();
cts.Cancel();
await Assert.ThrowsAnyAsync<OperationCanceledException>(async () => await tr.ReadToEndAsync(cts.Token));
CancellationToken token = cts.Token;

TaskCanceledException ex = await Assert.ThrowsAsync<OperationCanceledException>(async () => await tr.ReadToEndAsync(token));
Assert.Equal(token, ex.CancellationToken);
}

[Fact]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -929,8 +929,7 @@ private int ReadBuffer(Span<char> userBuffer, out bool readToUserBuffer)
return sb.ToString();
}

public override Task<string> ReadToEndAsync() =>
ReadToEndAsync(default);
public override Task<string> ReadToEndAsync() => ReadToEndAsync(default);

public override Task<string> ReadToEndAsync(CancellationToken cancellationToken)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -212,8 +212,7 @@ public virtual int ReadBlock(Span<char> buffer)
Task<string?>.Factory.StartNew(static state => ((TextReader)state!).ReadLine(), this,
cancellationToken, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default);

public virtual Task<string> ReadToEndAsync() =>
ReadToEndAsync(default);
public virtual Task<string> ReadToEndAsync() => ReadToEndAsync(default);

public virtual async Task<string> ReadToEndAsync(CancellationToken cancellationToken)
{
Expand Down Expand Up @@ -377,13 +376,15 @@ protected override void Dispose(bool disposing)
public override Task<string?> ReadLineAsync() => Task.FromResult(ReadLine());

[MethodImpl(MethodImplOptions.Synchronized)]
public override ValueTask<string?> ReadLineAsync(CancellationToken cancellationToken) => cancellationToken.IsCancellationRequested ? ValueTask.FromCanceled<string?>(cancellationToken) : new ValueTask<string?>(ReadLine());
public override ValueTask<string?> ReadLineAsync(CancellationToken cancellationToken)
=> cancellationToken.IsCancellationRequested ? ValueTask.FromCanceled<string?>(cancellationToken) : new ValueTask<string?>(ReadLine());

[MethodImpl(MethodImplOptions.Synchronized)]
public override Task<string> ReadToEndAsync() => Task.FromResult(ReadToEnd());

[MethodImpl(MethodImplOptions.Synchronized)]
public override Task<string> ReadToEndAsync(CancellationToken cancellationToken) => cancellationToken.IsCancellationRequested ? Task.FromCanceled<string>(cancellationToken) : Task.FromResult(ReadToEnd());
public override Task<string> ReadToEndAsync(CancellationToken cancellationToken)
=> cancellationToken.IsCancellationRequested ? Task.FromCanceled<string>(cancellationToken) : Task.FromResult(ReadToEnd());

[MethodImpl(MethodImplOptions.Synchronized)]
public override Task<int> ReadBlockAsync(char[] buffer, int index, int count)
Expand Down