Пытаясь выполнить несколько Запросов HTTP параллельно, но будучи ограниченным Windows (реестр)

Я разрабатываю приложение (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), и это, казалось, не влияло на мою пропускную способность вообще, таким образом, проблема не должна быть там также.

63
задан Jakub Šturc 7 November 2019 в 09:06
поделиться

2 ответа

Это вопрос ServicePoint . Что обеспечивает управление соединениями для HTTP-соединений. По умолчанию максимальное количество одновременных подключений, разрешенное объектом ServicePoint, равно 2. Поэтому, если вам нужно увеличить его, вы можете использовать свойство ServicePointManager.DefaultConnectionLimit . Просто проверьте ссылку в MSDN, там вы можете увидеть образец. И установите нужное вам значение.

95
ответ дан 24 November 2019 в 16:18
поделиться

Для 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 или любое другое желаемое число.

0
ответ дан 24 November 2019 в 16:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: