HttpWebRequest с использованием асинхронных методов - требуется уточнение - PullRequest
2 голосов
/ 03 марта 2011

Я хорошо знаком с использованием APM с классами, которые поддерживают APM. Однако у класса HttpWebRequest есть нюанс, которого я не заметил ни в одном другом классе. И чтобы добавить к путанице, всякий раз, когда я вижу код, который использует HttpWebRequest в асинхронном режиме, он пропускает вопрос, который у меня есть.

Итак, здесь: При выполнении POST с использованием класса HttpWebRequest, по сути, существует два метода, которые необходимо вызывать асинхронно.

  1. BeginGetRequestStream / EndGetRequestStream
  2. BeginGetResponse / EndGetResponse

Большая часть кода, который я вижу, пропускает вызов первого и вызывает только второй. Примеры использования Tasks и метода Task.Factory.FromAsync также «удобно» пропустить это.

Я знаю, что соединение устанавливается при вызове метода BeginGetRequestStream. Который связан с вводом / выводом и занимает определенное количество времени.

Итак, мои вопросы: если кто-то заинтересован в том, чтобы сделать это правильно:

  1. Разве нельзя вызывать методы Begin / End GetRequestStream, а затем также вызывать BeginGetResponse?
  2. Используя Task.Factory.FromAsync, существует ли простой способ вызвать оба этих метода? Кроме FromAsync, затем продолжить и перейти к другому FromAsync?

Ответы [ 2 ]

2 голосов
/ 04 марта 2011

Правильный способ (при создании сообщения) - вызвать оба этих метода asycn. Причина в том (как вы упомянули вид), вызов EndGetRequestStream (а не BeginGetRequestStream) устанавливает соединение, это может занять некоторое время, и поэтому, если вы не используете эту пару методов, ваши основные потоки будут блокироваться за этот период. Так что, если производительность является ключевой в вашем случае, вы должны вызвать оба асинхронных метода.

Что касается использования Задач. Я не знаю, что вы бы назвали «легким», но у меня есть пост в блоге, в котором рассматриваются различные стили создания постов http, включая некоторые варианты, где также используются задачи. HttpWebRequest - Модель асинхронного программирования / Task.Factory.FromAsyc

В частности, в первом листинге кода вы ищете метод PostAsyncTask. В различных тестах производительности, которые я провел, я обнаружил, что не та версия Task (метод под названием PostAsync) работает немного лучше. Лично я не нахожу (в этом случае версия Task тоже ничего не упрощает.

1 голос
/ 03 марта 2011

Вызов Begin / End GetRequestStream необходим только для записи в тело вашего запроса.Если вы не отправляете тело (например, GET), вы можете пропустить его.

Мне неизвестен прямой способ выполнить задачу с другой задачей без продолжения. Этот вопрос показывает возможный способ цепочки задач.Вы можете написать метод расширения с похожим стилем.

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