単純な HTTP 要求を介してサード パーティからルックアップ機能にアクセスするアプリケーション (winforms C# .NET 4.0) を開発しています。パラメータを指定して URL を呼び出すと、ルックアップの結果として小さな文字列が返されます。十分に単純です。
ただし、課題は、これらのルックアップを多数 (数千回) 行う必要があることであり、必要な時間を制限したいと考えています。したがって、リクエストを並行して実行したいと思います(たとえば、10-20)。これを行うために ThreadPool を使用します。コードの短いバージョンは次のようになります。
public void startAsyncLookup(Action<LookupResult> 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<String>
startAsyncLookup
returnLookupResult
最初は、サードパーティのシステムが貧弱である可能性があると考えていましたが、2 台の異なるマシンから同じコードを同時に実行しようとすることで、これを除外しました。2 人それぞれが 1 人で行ったのと同じくらい時間がかかったので、その 1 人を除外することができました。
同僚は、これが Windows の制限である可能性があることを教えてくれました。少しグーグルで検索したところ、この投稿の中で、デフォルトで、Windows は同じ Web サーバーへの同時リクエストの数を HTTP 1.0 では 4 に、HTTP 1.1 では 2 に制限していることがわかりました (HTTP 1.1 の場合、これは実際には仕様に従っています ( RFC2068)))。
上記の同じ投稿でも、これらの制限を引き上げる方法が提供されていました。(MaxConnectionsPerServer と MaxConnectionsPer1_0Server) に2 つのレジストリ値を追加すること[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings]
で、これを自分で制御できました。
それで、私はこれを試し(両方とも20歳まで座った)、コンピューターを再起動し、プログラムを再度実行しようとしました。悲しいことに、それは何の助けにもならなかったようです。また、バッチ ルックアップの実行中にリソース モニターを監視していたところ、アプリケーション (タイトルが塗りつぶされているアプリケーション) がまだ 2 つの TCP 接続しか使用していないことに気付きました。
では、問題は、なぜこれが機能しないのかということです。リンク先の投稿は、間違ったレジストリ値を使用していますか? これはおそらく、もはや Windows で「ハッキング」することはできないのでしょうか (私は Windows 7 を使用しています)。
また、誰かが疑問に思う場合に備えて、ThreadPool の MaxThreads のさまざまな設定 (10 から 100 までのすべて) も試してみましたが、これはスループットにまったく影響を与えていないようでした。