У меня есть кусок кода, как это:Ускорить запрос SOAP в C#
foreach (var e in foobar)
{
var myObj = new MyObj();
GenericResult res = soapClient.doSomething(e);
if(res.success == true){
myObj.a = e.a;
myObj.b = e.b;
}
}
Каждый SOAPRequest занимает около 500 миллисекунд, а иногда foobar
это элементы так 1000+ я тратить много времени на ожидание ответ soapClient. Я пробовал использовать Parallel.ForEach
, но он не работает, потому что поставщик SOAP принимает только сериализованные запросы. Поставщик предлагает использовать async
звонки, такие как soapClient.doSomthingAsync
Проблема заключается в том, что мне нечего делать, пока я не получил ответ soapClient.
Единственное решение, которое я имею в виду, использую Parallel.ForEach
и lock
в мыльном вызове
Если вам нужно сделать 1000 запросов, вам нужно сделать 1000 запросов ... возможно, вы могли бы рассмотреть лучшую модель для API SOAP, которую вы вызываете, - это под вашим контролем? Можете ли вы сделать несколько экземпляров 'soapClient'? –
@DanPuzey API не находится под моим контролем, и я не могу использовать больше экземпляров soapClient, потому что проверка множественного запроса зависит от учетной записи (я использую ключ API). Я использую Parallel For с блокировкой прямо сейчас, и это немного быстрее. Я думаю, что это лучшее решение :( – Federico
Знаете ли вы, использует ли этот сервер HTTP 1.1? ..., который по умолчанию использует постоянные подключения. В противном случае, если это HTTP 1.0, вы можете потребовать, чтобы соединение было открыто (Keep-Alive), так что вам не нужно будет продолжать связывание TCP для каждого запроса. Вам нужно будет посмотреть трафик на проводе (с помощью WireShark/Fiddler) ... http: // stackoverflow.com/questions/4699013/does-webclient-use-keepalive ... Также, как вы создаете свой «прокси» (Добавить ссылку на службу или Добавить веб-ссылку?) ... это WCF? (возможно, вы нажимаете ограничения на дросселирование) –