Отменить вызов aC# httpClient GetStreamAsync
Мне нужно добавить возможность отмены http-запроса в старом проекте C#.
В проекте используется HttpClient::GetStreamAsync, который, похоже, не поддерживает токены отмены.
Можно ли отменить вызов GetStreamAsync? Какие еще возможности у меня есть?
3 ответа
Из-за того, как работает поток, его нельзя отменить. Я обнаружил альтернативное решение в сообщении в блоге MSDN, написанном в 2012 году. Возможно, оно вам поможет. Автор использует GetStringAsync
но принцип также относится к GetStreamAsync
, Статья: Ждите HttpClient.GetStringAsync() и отмены.
В статье MSDN автор использует GetAsync(...)
который может принимать параметр отмены. Простое решение проблемы Натана может быть примерно таким...
CancellationTokenSource cancellationSource = new CancellationTokenSource();
CancellationToken cancellationToken = cancellationSource.Token;
Uri uri = new Uri('some valid web address');
HttpClient client = new HttpClient();
await client.GetAsync(uri, cancellationToken);
// In another thread, you can request a cancellation.
cancellationSource.Cancel();
Обратите внимание, что отмена производится на CancellationTokenSource
объект, а не CancellationToken
объект.
Вот простой пример.
public async Task<Stream> GetWebData(string url, CancellationToken? c = null)
{
using (var httpClient = new HttpClient())
{
var t = httpClient.GetAsync(new Uri(url), c ?? CancellationToken.None);
var r = await t;
return await r.Content.ReadAsStreamAsync();
}
}
То же, что и ответ Джонса, только как метод расширения:
internal static class HttpClientExtensions
{
public async static Task<Stream> GetStreamAsync(this HttpClient httpClient, string url, CancellationToken ct)
{
var response = await httpClient.GetAsync(new Uri(url), ct);
return await response.Content.ReadAsStreamAsync();
}
}