Мне не удалось найти способ отменить / прекратить операцию асинхронного чтения после успешного HttpWebRequest. Невозможно установить тайм-аут, ThreadPool.RegisterWaitForSingleObject тоже не работает. И закрытие базового сокета тоже не вариант, потому что ни HttpWebRequest / Reponse не предоставляют к нему доступ.
Редактировать:
К сожалению, этот подход, предложенный Санни, работает только для HttpWebRequest.BeginGetResponse. Для потока, который вы получаете после GetResponseStream (), по какой-то причине RegisterWaitForSingleObject не работает - обратный вызов никогда не вызывается.
Ситуация следующая: У меня есть приложение, использующее HttpGetRequest. Он построен с использованием примера MSDN по умолчанию для асинхронного httpwebrequest. Получение ответа работает как шарм. Но в редких случаях сервер, к которому подключается мой httpwebrequest, забывает закрыть сокет. Так что я зависаю от бесконечного чтения из BeginRead.
В некоторых редких случаях другой сервер забывает





Почему не RegisterWaitForSingleObject? Вы можете использовать его для тайм-аута, а в обработчике вы можете вызвать request.Abort ().
Вот пример. Кстати, я использовал подобный подход до того, как нашел эту статью в прошлом, и это сработало как шарм.
ПРИМЕЧАНИЕ. Настоящее завершение операции произойдет в следующем Stream.Read (только запрос / ответ был асинхронным) или Stream.EndRead (если чтение также является асинхронным). Вам по-прежнему необходимо зафиксировать исключение, созданное в обработчике EndXXXX.
Обновлено: Если RegisterWaitForSingleObject никогда не вызывается, у вас есть другая проблема, которая, скорее всего, связана с ThreadPool, у которого недостаточно свободных потоков. Обратный вызов для объекта RegisterWaitForSingle вызывается в потоке ThreadPool, и если в пуле нет свободного потока, он никогда не будет вызван. У вас есть несколько решений:
В любом случае увеличение размера пула вам не сильно поможет. Вы должны проверить свой код на предмет утечек ресурсов (потока) и убедиться, что вы не только вызываете request.Abort (), но и закрываете ответ. Убедитесь, что в ваших обратных вызовах вы используете правильный метод EndXXX и т. д.
Я наздраве :)