Зачем нам нужны оба BeginGetResponse и BeginRead? - PullRequest
0 голосов
/ 22 февраля 2012

Я смотрю на следующую ссылку для выполнения асинхронных веб-запросов с C #:

http://msdn.microsoft.com/en-us/library/86wf6409%28v=vs.100%29.aspx

Когда я создаю пример кода только с BeginGetResponse и EndGetResponse, мой «асинхронный вызов» по-прежнему занимает сотни миллисекунд.

Может кто-нибудь объяснить, почему для чтения требуется еще один асинхронный вызов, когда BeginGetResponse уже должен находиться в отдельном потоке?

Ответы [ 2 ]

5 голосов
/ 22 февраля 2012

Поскольку BeginGetResponse / EndGetResponse связаны с подключением к конечной точке Http (серверу может потребоваться некоторое время для ответа), а BeginRead / EndRead - для чтения потенциально длинного ответа из потока ответов.

Представьте себечто ваш ответ занимает 10 секунд, чтобы произвести на сервере, и объем данных, которые он выдает, скажем, 10 МБ.

  • Без первой пары вызовов Begin / EndGetResponse ваш поток будет заблокирован как минимум на 10 секунд, ожидая возвращения первого байта ответа .

  • Без второго набора вызовов Begin / EndRead ваш поток будет заблокирован, пока вы будете читать 10 МБ данных по одному сетевому пакету за раз (помните, что пакеты TCP имеют ограниченный размер, поэтомувсе они возвращаются к клиенту через некоторое время)

2 голосов
/ 22 февраля 2012

Я думаю, что это сопоставлено с базовыми операциями сокета.BeginGetResponse устанавливает соединение с сервером (вот почему это занимает так много времени) и отправляет запрос, пока BeginRead ожидает данные ответа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...