Методы
async void в C# выглядят безобидно, но скрывают ловушку. Если внутри такого метода возникнет исключение, поймать его стандартными средствами не получится. Оно просто вылетит в поток синхронизации и, скорее всего, уронит приложение.Почему вообще существует
async void? Всё просто: обработчики событий по соглашению возвращают void. Без поддержки async void нельзя было бы использовать async/await внутри них. Это единственный законный случай.Официальное правило звучит так:
async void допустим только как обработчик события, и такой метод не должен бросать исключения.Правильный обработчик выглядит примерно так:
private async void Button_Click(object sender, EventArgs e)
{
try
{
await DoSomethingAsync();
}
catch (Exception ex)
{
// обрабатываем ошибку здесь, не даём ей вылететь наружу
MessageBox.Show(ex.Message);
}
}
Всё остальное —
async Task или async Task<T>. Это позволяет нормально ловить исключения, ждать завершения и тестировать метод.Если видите
async void не в обработчике, это сигнал для ревью.📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#sharp_view