How to attach CancellationTokenSource to DownloadStringTaskAsync method and cancel the async call?
The async capabilities of WebClient
predate .Net 4.5, so it supports the Task-based Asynchronous Pattern only partially. That includes having its own cancellation mechanism: the CancelAsync()
method, which works even with the new -TaskAsync
methods. To call this method when a CancellationToken
is canceled, you can use its Register()
method:
cts.Token.Register(wc.CancelAsync);
As an alternative, you could use the new HttpClient
, as Stephen suggested, which fully supports TAP, including CancellationToken
s.
WebClient
doesn't support cancellation. I recommend you use a newer type such as HttpClient
:
...
cts = new CancellationTokenSource();
string result;
using (var client = new HttpClient())
using (var response = await client.GetAsync("http://gyorgybalassy.wordpress.com", cts.Token))
{
result = await response.Content.ReadAsStringAsync();
}
if (result.Length < 100000)
...
The GetAsync
method by default will not complete until it reads the entire response, so the await response.Content.ReadAsStringAsync
line will actually complete synchronously.
Extension methods based on svick's answer:
public static async Task<string> DownloadStringTaskAsync(this WebClient webClient, string url, CancellationToken cancellationToken) {
using (cancellationToken.Register(webClient.CancelAsync)) {
return await webClient.DownloadStringTaskAsync(url);
}
}
public static async Task<string> DownloadStringTaskAsync(this WebClient webClient, Uri uri, CancellationToken cancellationToken) {
using (cancellationToken.Register(webClient.CancelAsync)) {
return await webClient.DownloadStringTaskAsync(uri);
}
}