Почему async void — плохая практика?
Ответ от нейросети
sobes.tech AI
async void в C# считается плохой практикой по нескольким причинам:
-
Отсутствие возможности отследить завершение метода. Методы с возвращаемым типом
TaskилиTask<T>позволяют ожидать их завершение (await), аasync void— нет. -
Проблемы с обработкой исключений. Исключения, выброшенные в
async voidметодах, не могут быть пойманы черезtry-catchв вызывающем коде и приводят к аварийному завершению приложения. -
Трудности с тестированием. Методы
async voidсложно тестировать, так как нельзя дождаться их завершения. -
Использование только для обработчиков событий. Единственный допустимый случай — обработчики событий, где сигнатура требует
void.
Пример плохой практики:
async void DoWork()
{
await Task.Delay(1000);
throw new Exception("Error");
}
// Вызов
DoWork();
// Исключение не будет поймано здесь
Правильный подход — возвращать Task:
async Task DoWorkAsync()
{
await Task.Delay(1000);
throw new Exception("Error");
}
// Вызов
try
{
await DoWorkAsync();
}
catch (Exception ex)
{
// Обработка исключения
}
Таким образом, async void следует использовать только для событий, а в остальном — всегда возвращать Task.