Передайте срок операции, которая может отменить сетевую работу. Для существующего .NET HttpClient, настроенного через прокси:

using var deadline = new CancellationTokenSource(TimeSpan.FromSeconds(20));
using var response = await client.GetAsync(uri, deadline.Token);

Приложение предоставляет client и uri. Эта перегрузка принимает токен отмены; тайм-аут вокруг ожидания её задачи ограничил бы только ожидание этого вызывающего. Опрос флага завершения имеет ту же проблему: вызывающий может уйти, пока сокеты и рабочие остаются занятыми.

Отмена следует реализации клиента и пути очистки. Она не обещает, что каждое действие нижнего уровня остановится на точной инструкции. Дайте этому пути завершиться и освободите ресурсы, которыми владеет операция. Включите в проект отдельно управляемое чтение тела; для современной операции .NET ResponseHeadersRead передайте тот же токен через чтение тела. Другие клиенты предоставляют собственные интерфейсы отмены, прерывания и очистки.

Повторная попытка нуждается в результате предыдущей попытки. Сохраните её идентификатор и выбранный прокси, запросите отмену при необходимости и избегайте потери задачи, бесконечно запуская замены. Иначе медленная конечная точка может накапливать работу быстрее, чем приложение её освобождает.

Удалённый результат требует отдельной обработки. Возможно, адресат уже получил отправку, когда происходит отмена. Используйте политику восстановления или идемпотентности приложения; остановка локальной работы не отменяет удалённое действие.

Похожие статьи