C# Net.HttpClient Отменить ReadAsStringAsync?
Я использую SendAsync
с HttpCompletionOption.ResponseHeadersRead
сначала получить заголовки. Затем я проверяю Content-Type
и Content-Length
чтобы убедиться, что ответ разметку и размер приличный. Я использую CancellationTokenSource
отменить SendAsync
если он превышает определенный промежуток времени.
но тогда, если тип и размер верны, я продолжаю фактически получать строку разметки с ReadAsStringAsync
. могу ли я добавить токен отмены к этому вызову? так что если фактическая загрузка занимает слишком много времени, я могу прервать его. Или это может можно сделать по-другому?
Я не хочу использовать GetStringAsync
как я использую пользовательский HttpRequestMessage
.
PS: Я довольно новичок в C#, 2 недели. Что-то может ускользнуть от меня.
2 ответов
Нет, ты не можешь. Есть нет перегрузки ReadAsStringAsync
, который принимает токен отмены и вы не удается отменить асинхронную операцию без отмены.
однако вы можете отказаться от этой операции и двигаться дальше с WithCancellation
метод расширения, который фактически не отменит операцию, но позволит потоку кода, как если бы он был:
static Task<T> WithCancellation<T>(this Task<T> task, CancellationToken cancellationToken)
{
return task.IsCompleted
? task
: task.ContinueWith(
completedTask => completedTask.GetAwaiter().GetResult(),
cancellationToken,
TaskContinuationOptions.ExecuteSynchronously,
TaskScheduler.Default);
}
Если можно использовать большой молоток, вы можете удалить HttpClient,который отключит все. В отличие от отказа от нежелательного вызова GetStringAsync, это позволяет избежать потери сетевых ресурсов, что ускоряет другие операции (возможно, включая любую следующую операцию).