Я разрабатываю приложение (winforms C#.NET 4.0), где я получаю доступ к функциональности поиска от третьей стороны через простой Запрос HTTP. Я называю URL с параметром, и в ответ я получаю маленькую строку с результатом поиска. Достаточно простой.
Проблема однако, что я должен сделать много этих поисков (несколько тысяч), и я хотел бы ограничить необходимое время. Поэтому я хотел бы работать, запросы параллельно (скажите 10-20). Я использую ThreadPool, чтобы сделать это, и короткая версия моего кода похожа на это:
public void startAsyncLookup(Action returnLookupResult)
{
this.returnLookupResult = returnLookupResult;
foreach (string number in numbersToLookup)
{
ThreadPool.QueueUserWorkItem(lookupNumber, number);
}
}
public void lookupNumber(Object threadContext)
{
string numberToLookup = (string)threadContext;
string url = @"http://some.url.com/?number=" + numberToLookup;
WebClient webClient = new WebClient();
Stream responseData = webClient.OpenRead(url);
LookupResult lookupResult = parseLookupResult(responseData);
returnLookupResult(lookupResult);
}
Я заполняюсь numbersToLookup
(a List
) от другого места звонить startAsyncLookup
и предоставьте ему функцию обратного вызова returnLookupResult
возвратить каждый результат. Это работает, но я нашел, что не получаю пропускную способность, которую я хочу.
Первоначально я думал, что это могла бы быть третья сторона, имеющая плохую систему на их конце, но я исключил это путем попытки выполнить тот же код от двух различных машин одновременно. Каждый из этих двух взял, пока каждый сделал один, таким образом, я мог исключить тот.
Коллега затем снабдил подсказкой меня, что это могло бы быть ограничением в Windows. Я погуглил немного и нашел среди других это сообщение, говоря, который Windows по умолчанию ограничивает количество одновременного запроса к тому же веб-серверу к 4 для HTTP 1.0 и к 2 для HTTP 1.1 (для HTTP 1.1, который это на самом деле согласно спецификации (RFC2068)).
То же сообщение, упомянутое выше также, позволило увеличивать эти пределы. Путем добавления двух значений реестра к [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings]
(MaxConnectionsPerServer и MaxConnectionsPer1_0Server), я мог управлять этим сам.
Так, я попробовал это (находился оба к 20), перезапустил мой компьютер и попытался запустить мою программу снова. Печально, хотя, это, казалось, не помогло никому. Я также следил за Монитором ресурсов (см. снимок экрана) при выполнении моего пакетного поиска, и я заметил, что мое приложение (то с закрашенным черной краской заголовком) все еще только использовало два соединения TCP.
Так, вопрос, почему это не работает? Сообщение, я связался с использованием неправильных значений реестра? Разве это, возможно, не возможно "взломать" в Windows еще (я нахожусь в Windows 7)?
Любые идеи высоко ценились бы :)
И на всякий случай любой должен задаться вопросом, я также попробовал различными настройками для MaxThreads на ThreadPool (все от 10 до 100), и это, казалось, не влияло на мою пропускную способность вообще, таким образом, проблема не должна быть там также.
Это вопрос ServicePoint . Что обеспечивает управление соединениями для HTTP-соединений. По умолчанию максимальное количество одновременных подключений, разрешенное объектом ServicePoint, равно 2. Поэтому, если вам нужно увеличить его, вы можете использовать свойство ServicePointManager.DefaultConnectionLimit . Просто проверьте ссылку в MSDN, там вы можете увидеть образец. И установите нужное вам значение.
Для Internet Explorer 8: Запустите редактор реестра и перейдите к следующим ключам HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_MAXCONNECTION SPERSERVER
и
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_MAXCONNECTION SPERSERVER Explorer\MAIN\FeatureControl\FEATURE_MAXCONNECTION SPER1_0SERVER
Если FEATURE_MAXCONNECTIONSPERSERVER и FEATURE_MAXCONNECTIONSPER1_0SERVER отсутствуют, то создайте их. Теперь создайте DWORD-значение под названием iexplore.exe для обоих подключей (перечисленных выше) и установите их значение на 10 или любое другое желаемое число.