HttpWebRequest и порты завершения ввода-вывода

Я работаю над приложением, которое требует, чтобы один тип сообщения попадал в базу данных, а другой тип сообщения отправлялся и попадал в какой-то внешний xml api.

Мне нужно ОЧЕНЬ обработать ... одна из больших проблем - добиться хорошей работы класса HttpWebRequest. Изначально я начал с использования стандартных синхронных методов и всего этого. Это было нехорошо.

Итак, после небольшого чтения я увидел, что рекомендуемый способ сделать это - использовать методы Begin / End для делегирования работы портам завершения ввода-вывода, тем самым освобождая пул потоков и повышая производительность. Кажется, это не так ... производительность немного лучше, но я определенно не вижу, чтобы порты завершения ввода-вывода использовались так часто по сравнению с пулом потоков.

У меня есть поток, который вращается и отправляет мне доступные рабочие потоки + порты завершения в пуле потоков. Портов завершения всегда очень мало (я видел максимум 9 используемых), и я ' m всегда использует около 120 рабочих потоков (иногда больше). Я использую шаблон начала / конца для всех методов в httpwebrequest :

Begin/EndGetRequestStream
Begin/EndWrite (Stream)
Begin/EndGetResponse
Begin/EndRead (Stream)

Правильно ли я делаю? Я что-то пропустил? Я могу использовать (иногда) до 2048 HTTP-соединений одновременно (из вывода netstat) - почему номера портов завершения должны быть такими низкими?

Если бы кто-нибудь мог дать серьезный совет о том, как добиться успеха с этим управляющим рабочим потоком, завершение порты и httpwebrequest были бы очень признательны!

РЕДАКТИРОВАТЬ: .NET - разумный инструмент для этого? Могу ли я получить большое количество http-соединений, работающих с .NET и стеком System.Net? Было предложено использовать что-то вроде WinHttp (или какой-либо другой библиотеки C ++) и pInvoke из .NET, но я не особо хочу этого делать!

6
задан Brian Tompsett - 汤莱恩 18 June 2017 в 10:07
поделиться