Чем ожидание Task, Task<int> и async void отличается?

SaveAsync ожидают через await без значения, CountAsync — через await с получением 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.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее