2009-09-01 17 views
43

私はウェブアプリケーションをテストしており、数多くのスレッドをスピンアップし、それぞれのWebリクエストを送信するWindowsテストプログラムを設定しています。同時HttpWebRequestsの最大数

問題は、私は次の出力を得ることである:

ソートの5つのスレッドの最大は私がように100を作成した場合でも、ありますように見えます
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! 

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(); 
    } 

は、誰も私を啓発することができます何が起こっているのか?

おかげ

EDIT:提案として、私は5秒間スリープした場合、代わりのHttpWebRequestの、そして私はより多くのスレッドが発射ではなくのですか、私が期待したほど多く:

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! 

それはまだ私は毎秒2スレッドしか得ていないように見えます。私はConsole.WriteLineが問題になると思いますか?

編集:私は

ThreadPool.SetMinThreads(100, 4); 

System.Net.ServicePointManager.DefaultConnectionLimit = 100; 

を設定し、以下の結果得た:そう

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 

を同時にWeb要求の全体の多くを押し出すことができました。それは待ち行列に入っているように見えました(私はSTA COM +サーバーに呼び出す)ので、それは私が期待したものです。あなたの助け

+1

を私はあなたに質問がありますここに解決策があります。 msdn(https://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.defaultconnectionlimit(v=vs.110).aspx)によると、既定値は最大のint32です。あなたがここで設定した100以上。あなたが100に設定していなくても、それはどのように違いがありますか?つまり、ServicePointManagerのデフォルトの接続制限を設定したり、最初の応答でconnectionManagement要素を設定したりして解決したら疑いの余地はありません。 – foxwendy

+1

@foxwendyええ、MSDNはそうです。 int.MaxValue、.NET 4.5で試したところ、デフォルトでは** 2 **です。 – xmedeko

答えて

56

ため

おかげで万が一同じホストに行くあなたの要求のすべて(あるいはほとんど)いますか?ホストごとの制限が組み込まれています。これは、system.Net connectionManagement要素のapp.configで変更できます。

もう1つのことは、スレッドプールはスレッドの数を徐々に増加させることです。新しいスレッドはIIRCごとに開始されます。それはあなたが見ているものでしょうか?方程式からHttpWebRequestを取り除いてみてください。代わりに数秒間スリープしてください...

私は、後者の問題はあなたが当初実行していたものと思われますが、最初の問題は次のような問題を引き起こすでしょう。よく

+0

はい、それらはすべてlocalhostに行きます。 – Duncan

+0

この制限がlocalhostに適用されるかどうかは分かりませんが、それは間違いなく認識すべきことです。 appropraite app.config要素へのリンクについては、私の編集を参照してください。 –

+0

ありがとうございます。 – Duncan

48

送信HTTP同時接続数には制限があります。私はHttpWebRequestオブジェクトを作成する前に、静的プロパティSystem.Net.ServicePointManager.DefaultConnectionLimitを使用してこれを制御できると思います。

+0

誰かが好奇心が強い場合、この設定のデフォルト値は2です –

1

以下のコードが実行されるたびに実行されるように、以下のようにWindowsの設定でタグを書きます。したがって、以下のコードが実行されるたびに、私は並列要求/応答の最大1000000を持つことが許されます。

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

タグは

<connectionManagement> 
<clear/> 
<add address="*" maxconnection="1000000" /> 
</connectionManagement> 
3

私は、.NETのコアのためにこのことについて多くを聞いていません。ServicePointManagerは、.NETのコア1に含まれていますが、しかし、HttpClientをするために、あなたも、このような接続の最大数を設定することができ、バージョン2に再び戻ってあるように思われませんでした。

new HttpClient(new HttpClientHandler 
       { 
        MaxConnectionsPerServer = 100 
       }) 
関連する問題