SaveAsync ожидают через await без значения, CountAsync — через await с получением int. Async void оставляют для обработчика события: обычный вызывающий код не может ожидать его завершения.
Чем ожидание Task, Task<int> и async void отличается?
SaveAsync ожидают через await без значения, CountAsync — через await с получением int. Async void оставляют для обработчика события: обычный вызывающий код не может ожидать его завершения.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В C# есть три метода: async Task SaveAsync() сохраняет данные, async Task<int> CountAsync() возвращает число, async void OnClick(...) является обработчиком UI-события. В первых двух внутри ожидается сетевой вызов. Как их вызывать и обрабатывать ошибки?
Ответ
SaveAsync ожидают через await без значения, CountAsync — через await с получением int. Async void оставляют для обработчика события: обычный вызывающий код не может ожидать его завершения.
Сетевые операции выполняются внутри try/await/catch там, где нужны обработка ошибки и восстановление UI. В async void обработчике исключения нужно перехватывать внутри него: вызывающий код не получает Task с ошибкой. Не заменяйте await на .Result или .Wait в UI-контексте — они блокируют поток и могут вызвать deadlock. Само наличие async не создаёт отдельный поток и не определяет параллельность нескольких вызовов.
Источник: learn.microsoft.com.