Асинхронный HttpWebRequest - PullRequest
       27

Асинхронный HttpWebRequest

2 голосов
/ 14 июля 2011

Я работаю над веб-сканером и хочу использовать HttpWebRequest.он допускает асинхронные операции, такие как BeginGetResponse, но подключение с использованием HttpWebRequest.Create не асинхронно - и я хочу сделать около 1000 подключений одновременно, поэтому, используя этот метод (с дополнительным потоком для асинхронных), я не могу даже получить 2 подключения, потому чтопока второе соединение не соединит первое соединение, уже завершив загрузку контента, и это почти как если бы я подключался к веб-странице за страницей, а не одновременно.

Мне было интересно, есть ли хороший способ подключения около 1000 разиспользуя HttpWebRequest без создания тонны потоков или чего-либо еще ...

Заранее спасибо.

Редактировать: В конце концов это был не HttpWebRequest, который был медленным и блокирующим, это был BeginGetResponse - это блокировкапока не отправлены заголовки запроса?как я могу обойти это, использовать асинхронную отправку также с BeginGetRequestStream?

Ответы [ 3 ]

1 голос
/ 14 июля 2011

Все эти соединения идут в один домен?

Попробуйте добавить это в ваше приложение / web.config

0 голосов
/ 11 августа 2011

Нет причины, по которой должен блокироваться.Есть некоторые странности в том, как работают асинхронные веб-запросы, которые могут заставить ваши предполагаемые асинхронные запросы быть синхронными.Для начала, если вы на самом деле публикуете данные, вы должны использовать BeginGetRequestStream (вы не можете смешивать асинхронность и синхронизацию), см. http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.begingetrequeststream.aspx

Если я правильно помню, ничего не происходит с WebRequest.Create, он просто устанавливаетобъект, запрос не запускается до тех пор, пока BeginGetRequestStream или BeginGetResponse (в зависимости от того, является ли это публикацией или получением).

Еще одно важное замечание: в моих выводах гораздо больше задержек с чтением потока, поступающего изEndGetResponse, чем есть из запроса.Вам также следует использовать асинхронную версию чтения в потоке.

0 голосов
/ 14 июля 2011

Я не думаю, что вы можете создать несколько соединений в одном потоке. Вам нужна одна нить на соединение. Но вы можете изменить свой дизайн, чтобы сделать его более масштабируемым.

Вы можете создать один управляющий поток, который выполняет всю тяжелую работу (или, возможно, несколько из них), и каждый такой поток управления порождает несколько дочерних потоков, которые выходят и получают данные и помещают их в какой-то массив внутри родительского класса. , Затем класс управления может перерабатывать дочерние потоки. После завершения дочернего потока он получает еще одну «задачу». Основная идея, IMHO, заключается в том, чтобы отделить сканирование от обработки полученных данных. Получите, сохраните и обработайте позже.

Надеюсь, это поможет каким-то образом:)

...