Многие рекомендуют, как например здесь, использовать Task.Run() для Cpu-bound операций.
В статье по ссылке написано, что Task.Run() стоит использовать если:
- мы используем WinForms и хотим оставить наш UI поток отзывчивым
- мы хотим распараллелить задачи
- мы используем CPU-bound операции
Насчет CPU-bound операций у меня непонятка. Согласно рекоммендациям нужно писать так:
public async Task Foo()
{
await Task.Run(() => PerformLongCpuOperation());
}
public void PerformLongCpuOperation()
{
for (int i = 0; i < 10000; i++)
{
i = i * 32;
}
}`
Но что мы выиграем? Мы просто выносим операцию в фоновый поток. Да, вызывающий поток вернется в пул потоков, но у нас все так же будет один поток выполнять работу, плюс мы тратим ресурсы на переключение контекста. Не проще ли вызвать метод синхронно? Я не имею ввиду случаи с WinForms и WPF, где вызывающим потоком может быть UI поток.