Have a look at How do I cancel non-cancelable async operations?. If you just want the await
to finish while the request continues in the background you can use the author's WithCancellation
extension method. Here it is reproduced from the article:
public static async Task<T> WithCancellation<T>(
this Task<T> task, CancellationToken cancellationToken)
{
var tcs = new TaskCompletionSource<bool>();
using(cancellationToken.Register(
s => ((TaskCompletionSource<bool>)s).TrySetResult(true), tcs))
if (task != await Task.WhenAny(task, tcs.Task))
throw new OperationCanceledException(cancellationToken);
return await task;
}
It essentially combines the original task with a task that accepts a cancellation token and then awaits both tasks using Task.WhenAny
. So when you cancel the CancellationToken
the secodn task gets cancelled but the original one keeps going. As long as you don't care about that you can use this method.
You can use it like this:
return await Response.Content.ReadAsStringAsync().WithCancellation(token);
Update
You can also try to dispose of the Response as part of the cancellation.
token.Register(Reponse.Content.Dispose);
return await Response.Content.ReadAsStringAsync().WithCancellation(token);
Now as you cancel the token, the Content
object will be disposed.