.NET отменить поток BeginRead

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

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

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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
2 942
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

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

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

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

Я наздраве :)

Другие вопросы по теме