⏱️ Ускоряем async-код в C#: не просто await, а нормальная параллельность
Одна из частых ошибок в C# - писать независимые асинхронные операции так, будто они зависят друг от друга:
await GetUserAsync();
await GetOrdersAsync();
await GetRecommendationsAsync();
Выглядит нормально, но по факту это последовательное выполнение.
Если каждый запрос занимает примерно 1 секунду, весь блок будет выполняться около 3 секунд. Не потому что async медленный, а потому что мы сами заставили код ждать каждый шаг по очереди.
Правильнее запускать независимые операции сразу:
var userTask = GetUserAsync();
var ordersTask = GetOrdersAsync();
var recsTask = GetRecommendationsAsync();
await Task.WhenAll(userTask, ordersTask, recsTask);
Теперь все запросы стартуют одновременно, а общее время будет примерно равно самому долгому из них.
Но есть важный нюанс.
Task.WhenAll не делает CPU-код магически параллельным. Он особенно полезен для I/O-bound задач:
- запросы в базу
- HTTP-вызовы
- чтение файлов
- обращения к внешним API
- независимые операции с сетью
И ещё один момент: после WhenAll лучше доставать результаты уже из завершённых задач:
var user = await userTask;
var orders = await ordersTask;
var recs = await recsTask;
Так код остаётся читаемым, ошибки нормально пробрасываются, а логика не превращается в кашу.
Async/await сам по себе не ускоряет код. Он просто даёт возможность не блокировать поток. Ускорение появляется тогда, когда вы правильно запускаете независимые операции вместе, а не ждёте их по одной.
Обсуждение 11
Обсуждение не доступно в веб-версии. Чтобы написать комментарий, перейдите в приложение Telegram.
Обсудить в Telegram