Проблема N + 1
Помещение потоков, задач, асинхронности c, параллелизма в одну сторону, то, что вы описываете, является проблемой N + 1, которой следует избегать именно того, что случилось с вами. Все хорошо, когда N (ваше количество пользователей) мало, но оно останавливается по мере роста пользователей.
Возможно, вы захотите найти другое решение. Вы должны делать эту операцию для всех пользователей? Если да, то, возможно, переключитесь на фоновый процесс и разветвление для каждого пользователя.
Вернемся к ножному ружью (мне пришлось искать это, кстати BT).
Задачи - это обещания, аналогичные JavaScript. В. NET они могут завершаться в отдельном потоке - обычно потоке из пула потоков.
В. NET Core, они обычно завершаются в отдельном потоке, если не завершены, и точка ожидания , для HTTP-запроса, который почти наверняка так и будет.
Возможно, вы исчерпали пул потоков, но, поскольку вы делаете HTTP-запросы, я подозреваю, что вы исчерпали количество одновременных исходящих HTTP-запросов вместо. «По умолчанию ограничение на количество подключений составляет 10 для ASP. NET размещенных приложений и 2 для всех остальных». См. Документацию здесь .
Есть ли способ добиться некоторого параллелизма и не истощать ресурс (потоки или http-соединения)? - Да.
Вот шаблон, который я часто применяю именно по этой причине, используя Batch()
from morelinq .
IEnumerable<User> users = Enumerable.Empty<User>();
IEnumerable<IEnumerable<string>> batches = userIds.Batch(10);
foreach (IEnumerable<string> batch in batches)
{
Task<User> batchTasks = batch.Select(userId => GetUserDetailsAsync(userId));
User[] batchUsers = await Task.WhenAll(batchTasks);
users = users.Concat(batchUsers);
}
Вы все равно получаете десять асинхронных HTTP-запросов на GetUserDetailsAsync()
, и вы не исчерпываете потоки или одновременные HTTP-запросы (или, по крайней мере, максимально используете 10).
Теперь, если это интенсивно используемая операция или сервер с GetUserDetailsAsync()
активно используется в другом месте приложения вы можете достичь тех же пределов, когда ваша система находится под нагрузкой, поэтому такая группировка не всегда является хорошей идеей. YMMV.