.NET отменить поток BeginRead - PullRequest
3 голосов
/ 14 ноября 2008

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

Edit:

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

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

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

1 Ответ

1 голос
/ 14 ноября 2008

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

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

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

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

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

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

я наздраве:)

...