Вопрос

Мне не удалось найти способ отменить/прекратить асинхронную операцию чтения после успешного HttpWebRequest.Невозможно установить тайм-аут, ThreadPool.RegisterWaitForSingleObject тоже не работает.И закрытие базового сокета тоже не вариант, потому что ни HttpWebRequest/Reponse не предоставляет к нему доступа.

Редактировать:

К сожалению, этот подход, предложенный Sunny, работает только для HttpWebRequest.BeginGetResponse.Для потока, который вы получаете после GetResponseStream(), по какой-то причине RegisterWaitForSingleObject не работает — обратный вызов никогда не вызывается.

Ситуация следующая:У меня есть приложение, использующее HttpGetRequest.Он построен с использованием примера MSDN по умолчанию для асинхронного httpwebrequest.Получение ответа работает как шарм.Но в редких случаях сервер, к которому подключается мой httpwebrequest, забывает закрыть сокет.Вот я и завис на бесконечном чтении от BeginRead.

В некоторых редких случаях другой сервер забывает

Это было полезно?

Решение

Почему бы не RegisterWaitForSingleObject?Вы можете использовать его для тайм-аута, а в обработчике вызвать request.Abort().

Вот пример.Кстати, раньше я использовал аналогичный подход до того, как нашел эту статью, и он работал как шарм.

ПРИМЕЧАНИЕ:Реальное завершение операции произойдет на следующем Stream.Read (если только запрос/ответ был асинхронным) или Stream.EndRead (если чтение также является асинхронным).Вам все равно необходимо перехватить исключение, созданное в обработчике EndXXXX.

РЕДАКТИРОВАТЬ:Если RegisterWaitForSingleObject никогда не вызывается, то у вас есть другая проблема, которая, скорее всего, связана с ThreadPool, в котором недостаточно свободных потоков.Обратный вызов для объекта RegisterWaitForSingle вызывается в потоке ThreadPool, и если в пуле нет свободного потока, он никогда не будет вызван.У вас есть несколько решений:

  1. Сделайте ваши страницы асинхронными. Почему? Как.
  2. Изменить максимальное количество потоков в пуле.

В любом случае увеличение размера пула вам не слишком поможет.Вам необходимо проверить свой код на предмет утечек ресурсов (потоков) и убедиться, что вы не только вызываете request.Abort(), но и закрываете ответ.Убедитесь, что в ваших обратных вызовах вы используете правильный метод EndXXX и т. д.

Я наздраве :)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top