Número máximo de HttpWebRequests simultâneos

Estou testando o stress de um aplicativo da web e configurei um programa de teste do windows que gera vários threads e envia uma solicitação da web para cada um deles.

O problema é que eu recebo a seguinte saída:

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! 

Que tipo de parece que há um máximo de 5 segmentos, mesmo se eu criar 100 assim:

 int numberOfThreads = Convert.ToInt32(txtConcurrentThreads.Text); List workers = new List(); 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(); } 

Alguém pode me esclarecer sobre o que está acontecendo?

obrigado

EDIT: Se como sugerido eu durmo por 5 segundos, em vez de httpwebrequest, então eu recebo mais threads triggersndo, mas não tantos como eu esperava:

 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! 

Ainda parece que estou recebendo apenas 2 threads começando a cada segundo, o que parece muito lento para mim. Eu suponho que o Console.WriteLine poderia ser um problema?

EDIT: eu definir

 ThreadPool.SetMinThreads(100, 4); 

e

 System.Net.ServicePointManager.DefaultConnectionLimit = 100; 

e obteve os seguintes resultados:

 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 

por isso foi capaz de empurrar um monte de solicitações da web ao mesmo tempo. Que parecia fila (chamando para um servidor STA COM +) e é isso que eu esperava.

Obrigado pela ajuda

Todos (ou a maioria) dos seus pedidos vão para o mesmo host por acaso? Há um limite interno por host. Você pode alterar isso no app.config no elemento system.Net connectionManagement .

A outra coisa é que o pool de threads apenas aumenta seu número de threads gradualmente – ele inicia um novo thread a cada meio segundo, o IIRC. Isso pode ser o que você está vendo? Tente se livrar de HttpWebRequest da equação – basta dormir por alguns segundos em vez disso …

Eu suspeito que o último problema é o que você está enfrentando inicialmente, mas o primeiro vai lhe causar problemas também.

Existe um limite no número de conexões HTTP de saída simultâneas. Eu acho que você pode controlar isso usando a propriedade estática System.Net.ServicePointManager.DefaultConnectionLimit antes de criar os objects HttpWebRequest .

Se eu escrever abaixo tag na configuração do windows, ele será executado toda vez que o código abaixo for executado. Assim, toda vez que o código abaixo for executado, será permitido ter no máximo 1000000 de solicitação / resposta paralela.

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

Tag

     

Eu não ouvi muito sobre isso para o .NET Core. ServicePointManager não foi incluído no .NET Core 1, mas parece estar de volta na versão 2. No entanto, para o HttpClient, você também pode definir o número máximo de conexões como este:

 new HttpClient(new HttpClientHandler { MaxConnectionsPerServer = 100 })