HttpWebRequest.BeginGetResponse не является асинхронным - PullRequest
1 голос
/ 31 марта 2011

У меня есть код, который повторяет несколько 100 URL-адресов и запрашивает данные из Интернета.

Это выглядит примерно так

for each url in urls
  Dim hwr = CType(WebRequest.Create(url), HttpWebRequest)
  Dim rq = New ReqArgs
  rq.Url= url
  rq.Request = hwr
  Dim res = 
     hwr.BeginGetResponse(New AsyncCallback(AddressOf FinishWebRequest), rq)
  Dim a = 1
next

Выглядит ли это нормально?

Почему линия BeginGetresponse занимает около 2-3 секунд, прежде чем перейти к dim a=1 ?.

На самом деле я отладил и вижу, что FinishWebRequest процедура полностью выполняется до достижения Dim a=1.

Так что же это за асинхронный?в любое время с помощью асинхронного.я?Или есть другой способ сделать это?

Дело в том, что основной саб должен отработать 300 запросов и вернуть управление в пользовательский интерфейс, тогда FinishWebRequest должен обрабатывать их медленно в своем собственном потоке и самостоятельно.время, когда поступают запросы.

Как мне это сделать?

Кстати, основной саб работает в BackgroundWorker, но я проверил без BackgroundWorker ипроблема та же

Кажется, что ответ должен быть здесь , но он просто не работает для меня

Я WPF 4.0

Ценю вашпомощь и совет.Спасибо

Ответы [ 2 ]

4 голосов
/ 03 апреля 2011

1001 * да *

проблема была с POST

Теперь я начинаю писать так:

Dim ReqStream = hwr.BeginGetRequestStream(New AsyncCallback(AddressOf FinishRequestStream), rq)

и тогда мой обратный вызов такой

Sub FinishRequestStream(ByVal result As IAsyncResult)
    Dim ag = CType(result.AsyncState, ReqArgs)
    Dim postStream = ag.Request.EndGetRequestStream(result)
    Dim PostBytes = Encoding.UTF8.GetBytes(ag.PostText)
    postStream.Write(PostBytes, 0, PostBytes.Length)
    postStream.Close()
    Dim res = ag.Request.BeginGetResponse(New AsyncCallback(AddressOf FinishResponse), ag)
End Sub

надеюсь, это поможет кому-то в будущем

1 голос
/ 20 июля 2016

Повторно отправив это из другого вопроса .

Из документации по HttpWebRequest.BeginGetResponse Method :

Метод BeginGetResponse требует выполнения некоторых задач синхронной настройки (например, разрешение DNS, обнаружение прокси-сервера и TCP-сокета), прежде чем этот метод станет асинхронным. [...] может потребоваться значительное время (до нескольких минут в зависимости от настроек сети) для выполнения начальных задач синхронной настройки, прежде чем будет сгенерировано исключение для ошибки или метод завершится успешно.

Чтобы избежать ожидания настройки, вы можете использовать Метод HttpWebRequest.BeginGetRequestStream но имейте в виду, что:

Ваше приложение не может смешивать синхронные и асинхронные методы для определенного запроса. Если вы вызываете метод BeginGetRequestStream, вы должны использовать метод BeginGetResponse для получения ответа.

...