Проверяет понимание моделей параллельности и неблокирующего ввода-вывода.
CPU-bound задачи используют потоки и Parallel/Tasks для распределения вычислений между ядрами и могут потребовать lock/SemaphoreSlim. IO-bound операции (await httpClient.GetAsync) не блокируют поток — метод возвращает Task, освобождая поток для других задач, а по завершении I/O продолжает выполнение в пуле. async/await трансформирует метод в state machine, которая при встрече await регистрирует продолжение и возвращает Task без блокировки текущего потока.
CPU-bound:
Интенсивные вычисления, используют Parallel.For, Task.Run, многопоточность.
Требуют синхронизации для разделяемых данных (lock, Monitor, SemaphoreSlim).
IO-bound:
Сеть, файлы, БД — async операции возвращают Task и не держат поток занятым.
Поток используется для других задач пока ждёт I/O.
Как async/await работает:
Компилятор генерирует машину состояний: при await метод сохраняет контекст и выходит, возвращая Task.
По завершении awaited Task продолжение помещается в пул потоков или в SynchronizationContext.
Вывод:
IO-bound лучше писать асинхронно, CPU-bound — параллельно на несколько потоков.