Sobes.tech
Назад к вопросам
Middle+
7

Почему async void — плохая практика?

Компании, где спрашивали
Core outstaff

Ответ от нейросети

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.