Кажется, что нет предела, или, по крайней мере, он высокий.
Я сделал приложение веб-API по умолчанию, изменил метод контроллера шаблона:
// GET api/values
public async Task<IEnumerable<string>> Get()
{
Debug.Print("Called");
Thread.Sleep(100000);
return new string[] { "value1", "value2" };
}
I затем создал программу, которая, используя один экземпляр HttpClient, могла бы выполнять множество одновременных подключений, используя Task.Run
.
List<Task> tasks = new List<Task>();
var task1 = Task.Run(() => httpClient.GetAsync("http://localhost:57984/api/values"));
var task2 = Task.Run(() => httpClient.GetAsync("http://localhost:57984/api/values"));
var task3 = Task.Run(() => httpClient.GetAsync("http://localhost:57984/api/values"));
var task4 = Task.Run(() => httpClient.GetAsync("http://localhost:57984/api/values"));
var task5 = Task.Run(() => httpClient.GetAsync("http://localhost:57984/api/values"));
var task6 = Task.Run(() => httpClient.GetAsync("http://localhost:57984/api/values"));
var task7 = Task.Run(() => httpClient.GetAsync("http://localhost:57984/api/values"));
var task8 = Task.Run(() => httpClient.GetAsync("http://localhost:57984/api/values"));
var task9 = Task.Run(() => httpClient.GetAsync("http://localhost:57984/api/values"));
var taskA = Task.Run(() => httpClient.GetAsync("http://localhost:57984/api/values"));
var taskB = Task.Run(() => httpClient.GetAsync("http://localhost:57984/api/values"));
var taskC = Task.Run(() => httpClient.GetAsync("http://localhost:57984/api/values"));
var taskD = Task.Run(() => httpClient.GetAsync("http://localhost:57984/api/values"));
var taskE = Task.Run(() => httpClient.GetAsync("http://localhost:57984/api/values"));
await Task.WhenAll(task1, task2, task3, task4, task5, task6, task7, task8, task9, taskA, taskB, taskC, taskD);
Я запустил их, и слово 'Called' было зарегистрировано 14 раз.
Поскольку Thread.Sleep будет блокировать ответ, это должно означать, что было одновременных 14 соединений.
Есть два свойства, которые могут повлиять на максимальное количество соединений, что я ' мы нашли, посмотрев в Google:
ServicePointManager.DefaultConnectionLimit
, который по умолчанию равен 2
, и HttpClientHandler.MaxConnectionsPerServer
, который также равен 2.
Как я могу сделать больше, чем 2 соединения, я действительно не знаю, если это просто игнорируется, или это неправильные настройки, или что. Изменение их, похоже, не дает никакого эффекта.
Я заметил, после многих остановок и запуска моих тестовых проектов, что новые подключения выполнялись гораздо медленнее. Я предполагаю, что я переполнил пул соединений.
Мой вывод таков: если вы установите эти два значения на что-то более высокое (на всякий случай, я имею в виду, почему бы и нет), то вы можете использовать один httpclient одновременно, где соединения будут по-настоящему параллельными, а не последовательными и поточно-ориентированными.