Обычно бесполезно запускать другой поток для выполнения каких-то синхронных действий, если все, что вам нужно сделать, это дождаться завершения этого потока.
Сравните:
async Task<int> ProcessAsync()
{
var task = Task.Run(() => DoSomeHeavyCalculations());
int calculationResult = await task;
return calculationResult;
}
с помощью
int ProcessAsync()
{
return DoSomeHeavyCalculations();
}
Помимо того, что асинхронная функция использует больше интеллектуальных возможностей, она ограничивает повторное использование функции: ее могут использовать только асинхронные абоненты.Пусть ваш абонент решит, хочет ли он позвонить вам асинхронно или нет.Если ему тоже нечего делать, кроме как ждать, он может позволить своему вызывающему решить и т. Д.
Кстати, это именно то, что делает GetData
: это не заставляет вызывающих, таких как вы, быть асинхронными,он дает вам свободу называть его синхронным или использовать Task.Run
для вызова асинхронного.
Однако, если вы выполняете какую-то функцию во время тяжелых вычислений, это может быть полезно:
async Task<int> ProcessAsync()
{
var task = Task.Run(() => DoSomeHeavyCalculations());
// while the calculations are being performed, do something else:
DoSomethingElse();
return await task;
}
В вашем примере: если есть только один «тяжелый расчет», сделайте это сами.Если есть несколько тяжелых вычислений, которые вы можете рассмотреть, используя Task.Run
.Но не просто приказывайте другим потокам делать что-то, не делая ничего самостоятельно.