Я пытаюсь ограничить количество максимальных подключений, которые у меня есть до конечной точки, и я делаю это, установив 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?
Благодарю.
Используйте тот же экземпляр HttpClient для всех запросов, и предел соединения будет работать, как ожидалось.