65

単純な 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>startAsyncLookupreturnLookupResult

最初は、サードパーティのシステムが貧弱である可能性があると考えていましたが、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 までのすべて) も試してみましたが、これはスループットにまったく影響を与えていないようでした。

4

4 に答える 4

96

それはServicePointの問題です。これは、HTTP接続の接続管理を提供します。ServicePointオブジェクトで許可されるデフォルトの最大同時接続数は2です。したがって、それを増やす必要がある場合は、ServicePointManager.DefaultConnectionLimitプロパティを使用できます。サンプルを見ることができるMSDNのリンクを確認してください。そして、必要な値を設定します。

于 2010-06-02T17:45:26.220 に答える
29

誰かのためのより速い参照のために。ホストごとの接続制限を増やすには、Main() で、または HTTP 要求の作成を開始する前にいつでもこれを行うことができます。

   System.Net.ServicePointManager.DefaultConnectionLimit = 1000; //or some other number > 4
于 2012-10-23T06:29:01.673 に答える
0

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 SPER1_0SERVER

FEATURE_MAXCONNECTIONSPERSERVER と FEATURE_MAXCONNECTIONSPER1_0SERVER がない場合は、作成します。ここで、両方のサブ キー (上記) に対して iexplore.exe という DWORD 値を作成し、それらの値を 10 または任意の数値に設定します。

于 2010-06-02T17:41:09.217 に答える