Прежде всего, если Presenter.Search
уже возвращает Task
, вам следует сделать обработчик событий async
и просто поместить
await Presenter.Search();
в блок try-catch.
Причина перегрузки Task.Run(Func<Task>)
заключается в том, что вы можете принудительно запланировать выполнение уже существующего Task
в потоке пула.Этот случай может быть оправдан в очень редких случаях, так как обычно вам следует полагаться на внутреннюю реализацию методов возврата Task
.Но если вы знаете, что асинхронный метод не использует потоки (например, просто возвращает Task
, который будет завершен при конкретном событии), и вы достаточно уверены в том, что принудите выполнение в потоке пула, вы можете сделать это следующим образом.путь.Но и в этом случае вам следует дождаться внешней задачи;в противном случае вызов будет «забыл и забыл», и вы ничего не поймете:
await Task.Run(() => Presenter.Search());
Обратите внимание, что я пропустил внутренний async-await:
await Task.Run(async () => await Presenter.Search());
Это также будет работатьи функционально эквивалентен предыдущей версии, но добавляет ненужный внутренний конечный автомат к цепочке задач для выполнения.
TL; DR: Без знания каких-либо дополнительных подробностей await Presenter.Search();
представляется лучшим решением, но также await Task.Run(() => Presenter.Search());
может быть оправдано, если вы знаете, что делаете.