Структура кода подразумевает, что DoExpensiveCalculation
является операцией, связанной с процессором. Если вы хотите отключить связанную с процессором операцию без загрузки процессора, Thread.Sleep
является подходящей опцией.
Я не уверен, смогу ли я без проблем поменять DoExoyCalculation на метод Async, такой как GetStringAsync, из HttpClient.
Ну, это совсем другое. GetStringAsync
не является операцией, связанной с процессором; это операция ввода-вывода.
Операции, связанные с вводом / выводом, являются естественно асинхронными и могут использоваться непосредственно с async
и await
. Связанные с процессором операции, естественно, являются синхронными, поэтому иногда вам нужно использовать Task.Run
. «Иногда» в этом случае обычно означает «когда вы в потоке пользовательского интерфейса», так что пользовательский интерфейс не останавливается во время выполнения операции с привязкой к процессору. Когда вы оборачиваете связанную с процессором операцию в Task.Run
, вы можете обрабатывать ее как асинхронную, то есть await
, извлекая ее из потока пользовательского интерфейса.
Ваш пример кода представляет собой консольное приложение, где использование Task.Run
обычно не требуется. Консольные приложения обычно запускают любой код, который им необходим для запуска и выхода; в большинстве случаев нет интерфейса пользователя, который нужно поддерживать адаптивным, и, следовательно, нет необходимости в Task.Run
.