Maksymalna liczba jednoczesnych Httpwebrequestów

Testuję aplikację internetową i skonfigurowałem program testowy windows, który uruchamia wiele wątków i wysyła żądanie internetowe na każdy z nich.

Problem polega na tym, że otrzymuję następujące wyjście:

01/09/09 11:34:04 Starting new HTTP request on 10
01/09/09 11:34:04 Starting new HTTP request on 11
01/09/09 11:34:04 Starting new HTTP request on 13
01/09/09 11:34:05 Starting new HTTP request on 14
01/09/09 11:34:05 Starting new HTTP request on 11
01/09/09 11:34:05 11 has finished!
01/09/09 11:34:05 Starting new HTTP request on 13
01/09/09 11:34:05 13 has finished!
01/09/09 11:34:05 Starting new HTTP request on 14
01/09/09 11:34:05 14 has finished!
01/09/09 11:34:05 Starting new HTTP request on 11
01/09/09 11:34:05 11 has finished!
01/09/09 11:34:05 Starting new HTTP request on 14
01/09/09 11:34:05 14 has finished!
01/09/09 11:34:05 Starting new HTTP request on 13
01/09/09 11:34:05 13 has finished!
01/09/09 11:34:05 Starting new HTTP request on 15
01/09/09 11:34:06 Starting new HTTP request on 11
01/09/09 11:34:06 11 has finished!
01/09/09 11:34:06 Starting new HTTP request on 14
01/09/09 11:34:06 14 has finished!

Wygląda na to, że jest maksymalnie 5 wątków, nawet jeśli stworzę 100 w ten sposób:

int numberOfThreads = Convert.ToInt32(txtConcurrentThreads.Text);

    List<BackgroundWorker> workers = new List<BackgroundWorker>();

    for (int N = 0; N < numberOfThreads; N++)
    {

        BackgroundWorker worker = new BackgroundWorker();
        worker.DoWork += new DoWorkEventHandler(worker_DoWork);
        worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
        workers.Add(worker);
    }


    foreach(BackgroundWorker worker in workers)
    {
        worker.RunWorkerAsync();
    }
Czy ktoś może mnie oświecić, co się dzieje?

Dzięki

EDIT: jeśli zgodnie z sugestią zasypiam przez 5 sekund, zamiast httpwebrequest, to dostaję więcej wątków strzelam ale nie tak dużo jak bym się spodziewał:

01/09/09 11:56:14 Starting new HTTP request on 7
01/09/09 11:56:14 Starting new HTTP request on 11
01/09/09 11:56:15 Starting new HTTP request on 12
01/09/09 11:56:15 Starting new HTTP request on 13
01/09/09 11:56:16 Starting new HTTP request on 14
01/09/09 11:56:16 Starting new HTTP request on 15
01/09/09 11:56:17 Starting new HTTP request on 16
01/09/09 11:56:17 Starting new HTTP request on 17
01/09/09 11:56:18 Starting new HTTP request on 18
01/09/09 11:56:19 Starting new HTTP request on 7
01/09/09 11:56:19 7 has finished!
01/09/09 11:56:19 Starting new HTTP request on 11
01/09/09 11:56:19 11 has finished!
01/09/09 11:56:19 Starting new HTTP request on 19
01/09/09 11:56:20 Starting new HTTP request on 20
01/09/09 11:56:20 Starting new HTTP request on 12
01/09/09 11:56:20 12 has finished!

Nadal wygląda na to, że co sekundę uruchamiam tylko 2 wątki, co wydaje mi się bardzo powolne. Chyba konsola.WriteLine może być problemem?

EDIT: I set

ThreadPool.SetMinThreads(100, 4); 

I

System.Net.ServicePointManager.DefaultConnectionLimit = 100;

I otrzymaliśmy następujące wyniki:

01/09/09 14:00:07 Starting new HTTP request on 11
01/09/09 14:00:07 Starting new HTTP request on 81
01/09/09 14:00:07 Starting new HTTP request on 82
01/09/09 14:00:07 Starting new HTTP request on 79
01/09/09 14:00:07 Starting new HTTP request on 83
01/09/09 14:00:07 Starting new HTTP request on 84
01/09/09 14:00:07 Starting new HTTP request on 85
01/09/09 14:00:07 Starting new HTTP request on 87
01/09/09 14:00:07 Starting new HTTP request on 88
...
01/09/09 14:00:07 84 has finished! Took 323.0323 milliseconds
01/09/09 14:00:08 88 has finished! Took 808.0808 milliseconds
01/09/09 14:00:08 96 has finished! Took 806.0806 milliseconds
01/09/09 14:00:08 94 has finished! Took 806.0806 milliseconds
01/09/09 14:00:08 98 has finished! Took 801.0801 milliseconds
01/09/09 14:00:08 80 has finished! Took 799.0799 milliseconds
01/09/09 14:00:08 86 has finished! Took 799.0799 milliseconds
01/09/09 14:00:08 92 has finished! Took 799.0799 milliseconds
01/09/09 14:00:08 100 has finished! Took 812.0812 milliseconds
01/09/09 14:00:08 82 has finished! Took 1010.101 milliseconds

Więc był w stanie wypchnąć całą masę żądań internetowych jednocześnie. Co wydawało się kolejką (wołanie na serwer STA COM+) więc to co ja oczekiwane.

Dzięki za pomoc

Author: Duncan, 2009-09-01

4 answers

Czy wszystkie (lub większość) twoich próśb trafiają do tego samego hosta? Istnieje wbudowany limit na podstawie hosta. Możesz to zmienić w aplikacji.config w system.Net connectionManagement element.

Inna sprawa, że pula wątków tylko stopniowo zwiększa swoją liczbę wątków - uruchamia nowy wątek co pół sekundy, IIRC. Czy to jest to, co widzisz? Spróbuj pozbyć się HttpWebRequest z równania-po prostu prześpij się przez kilka sekund zamiast tego...

Podejrzewam, że ten drugi problem jest tym, na który początkowo wpadasz, ale pierwszy z nich spowoduje również problemy dla Ciebie.

 64
Author: Jon Skeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-01 10:51:55

Istnieje ograniczenie liczby jednoczesnych wychodzących połączeń HTTP. Myślę, że możesz to kontrolować za pomocą System.Net.ServicePointManager.DefaultConnectionLimit właściwość statyczna przed wytworzeniem obiektów {[1] }.

 49
Author: Fredrik Mörk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-01 11:27:48

Jeśli napiszę poniżej znacznik w windows config, to będzie on wykonywany za każdym razem, gdy poniższy kod zostanie wykonany. Więc za każdym razem, gdy poniższy kod zostanie wykonany, będę mógł mieć max 1000000 nie równoległego żądania / odpowiedzi.

HttpWebRequest POSTRequest = (HttpWebRequest)WebRequest.Create("http://yahoo.com");

Tag

<connectionManagement>
 <clear/>
 <add address="*" maxconnection="1000000" />
</connectionManagement>
 4
Author: user220550,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-03 08:14:31

Nie słyszałem o tym zbyt wiele dla. NET Core. ServicePointManager nie był dołączony do. NET Core 1, ale wydaje się, że wrócił ponownie w wersji 2. Jednak dla HttpClient można również ustawić maksymalną liczbę połączeń w następujący sposób:

new HttpClient(new HttpClientHandler
                {
                    MaxConnectionsPerServer = 100
                })
 4
Author: cbp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-24 08:11:56