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, это позволяет избежать потери сетевых ресурсов, что ускоряет другие операции (возможно, включая любую следующую операцию).