2010-08-23 2 views
3

Есть много частей, связанных с httpwebrequest, которые могут идти асинхронно. Я помню, как читал здесь вопрос по этой теме, но я больше не могу его найти. Поэтому я перепрошу вопрос. Что из следующего получило наибольшее влияние на доллар (так сказать).части асинхронного httpwebrequest

BeginGetRequestStream/EndGetRequestStream

BeginWrite/EndWrite

BeginGetResponse/EndGetResponse

BeginRead/EndRead

Я понимаю, что BeginGetResponse должен быть сопряжен с BeginGetRequestStream. Поэтому нет необходимости повторять этот факт.

Из исследования, которое я сделал, кажется, что BeginRead/EndRead может иметь наибольший потенциал. Это немного потрясло. Похоже, что EndGetResponse возвращается довольно быстро и происходит значительная задержка после «первого контакта» и любых реальных данных, поступающих на чтение. Я уверен, что сразу получаю некоторые заголовки, а затем долгое время, а затем данные, которые я хочу.

Я предполагаю, что мой реальный вопрос: я что-то делаю с BeginGetResponse или является настоящим ценным игроком здесь BeginRead?

Как всегда, заранее.

ответ

2

EndGetResposnse (или, действительно, синхронный GetResponse) возвращается после получения начала данных. Это может быть небольшая или большая часть общего времени отклика.

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

Таким образом, наибольший выигрыш в производительности может заключаться в обработке этого способом, который позволяет эффективно перейти на следующий уровень. Один из способов - сделать всю обработку asynch, а не использовать асинхронные методы httpwebrequest.

Другим является то, что если вы создаете тип сбора из ответа, используйте ienumerable на основе yield, который позволяет обрабатывать по мере его поступления (очень мощный в тандеме с видом отложенного выполнения, доступным по передавая его на дальнейшую обработку yield или с помощью метода LINQ). Преимущество этого может перевесить преимущества, которые могут быть достигнуты за счет применения подхода asych, хотя они также могут быть объединены.

+0

Вы ссылаетесь на перемещение всего httprequest (включая чтение потока) в другой поток (через делегата или иначе)? Я стараюсь избегать таких вещей, поскольку я на самом деле хочу перерабатывать потоки в эти промежутки времени, а не просто получать отзывчивость. – aepheus

+0

Вот что я имею в виду во втором предложении моего третьего абзаца. Следующая идея не обращает внимания на потоки вообще, но дает выигрыш в реагировании по-другому. Я не уверен, что в любом случае будет много выигрыша, всегда будет поток, обрабатывающий или блокирующий, или это вопрос того, как вы нажимаете ограничения потоков? –

Смежные вопросы