1

エンドポイントへの最大接続数を制限しようとしていますが、ServicePointManager.DefaultConnectionLimit を設定してこれを行っていますが、機能していません。これをテストするために、5 秒間スリープしてから戻るエンドポイントをセットアップしました。

これが私のコードです:

class Program
{
    private static Uri uri = new Uri("http://myservice.com?sleepForMillisecond=5000"));

    static void Main(string[] args)
    {
        ServicePointManager.DefaultConnectionLimit = 1;
        MainAsync().Wait();
    }

    static async Task MainAsync()
    {
        var watch = Stopwatch.StartNew();
        var tasks = new List<Task>()
            {
                Task.Run(async () => await MakeCallWithHttpClient()),
                Task.Run(async () => await MakeCallWithHttpClient()),
                Task.Run(async () => await MakeCallWithHttpClient())
            };

        await Task.WhenAll(tasks);
        watch.Stop();
        Console.WriteLine("Elapsed Time For HttpClient: " + watch.Elapsed);

        watch.Restart();
        tasks = new List<Task>()
            {
                Task.Run(async () => await MakeCallWithWebClient()),
                Task.Run(async () => await MakeCallWithWebClient()),
                Task.Run(async () => await MakeCallWithWebClient())
            };

        await Task.WhenAll(tasks);
        watch.Stop();
        Console.WriteLine("Elapsed Time For WebClient: " + watch.Elapsed);
        Console.WriteLine("Press Enter To Exit.");
        Console.ReadLine();
    }

    private static async Task MakeCallWithHttpClient()
    {
        var client = new HttpClient();
        await client.GetStringAsync(uri);
        Console.WriteLine("Done");
    }

    private static async Task MakeCallWithWebClient()
    {
        var client = new WebClient();
        await client.DownloadStringTaskAsync(uri);
        Console.WriteLine("Done");
    }
} 

以下は出力です。

Done
Done
Done
Elapsed Time For HttpClient: 00:00:05.0953943
Done
Done
Done
Elapsed Time For WebClient: 00:00:15.0450096

ご覧のとおり、非同期 HttpClient は最大接続数 1 によって制限されません。これは、3 つの呼び出しを並行して行うのに 5 秒かかるためです。非同期 WebClient は、並行して 3 つの呼び出しを行うのに 15 秒かかるため、1 つの接続によって制限されます。

私の質問は...非同期HttpClientを使用して最大接続を制限するにはどうすればよいですか?

ありがとう。

4

1 に答える 1

0

すべてのリクエストに同じ HttpClient インスタンスを使用すると、接続制限が期待どおりに機能します。

于 2014-08-02T14:45:45.397 に答える