Вы не можете вернуть задачу, если сам метод объявлен как async
- поэтому это не будет работать, например:
async Task BarAsync()
{
return BazAsync(); // Invalid!
}
Для этого потребуется тип возврата Task<Task>
.
Если ваш метод просто выполняет небольшой объем работы, а затем вызывает только один асинхронный метод, тогда ваш первый вариант в порядке, и означает, что есть еще одна задача. Вы должны знать, что любые исключения, возникающие в вашем синхронном методе , будут доставлены синхронно, хотя, действительно, именно так я предпочитаю обрабатывать аргументы.
Это также общий шаблон для внедрение перегрузки, например маркером отмены.
Просто имейте в виду, что если вам нужно перейти на ожидание чего-то другого, вам нужно сделать его асинхронным. Например:
// Version 1:
Task BarAsync()
{
// No need to gronkle yet...
return BazAsync();
}
// Oops, for version 2 I need to do some more work...
async Task BarAsync()
{
int gronkle = await GronkleAsync();
// Do something with gronkle
// Now we have to await BazAsync as we're now in an async method
await BazAsync();
}