Как ограничить соединения с Async HttpClient C #

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 ограничен 1 соединением, так как 3 одновременных вызова занимают 15 секунд.

Мой вопрос... Как ограничить максимальные соединения с помощью асинхронного HttpClient?

Благодарю.

  • 0
    Чтобы стать просветленным, прочитайте этот интересный пост SO ... stackoverflow.com/questions/16194054/… async или многопоточный?
Теги:
connection
http
dotnet-httpclient

1 ответ

0

Используйте тот же экземпляр HttpClient для всех запросов, и предел соединения будет работать, как ожидалось.

  • 0
    Я использую тот же экземпляр httpclient, однако я не вижу, чтобы это имело какой-либо эффект. Есть намеки?
  • 0
    @ TomaszJaskuλa Когда вы делаете несколько запросов, сколько соединений открывается? Что задано для DefaultConnectionLimit?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню