Создаем портфолио за 1 месяц
К концу месяца: 4 классных проекта в вашем портфолио! Стоимость: 100$. Подробности...
⊗csSpAsVd 347 of 509 menu
◀ ▶

Опасность async void в C#

Метод async void компилируется как обычный void: вызывающий код не получает задачу и не может дождаться завершения или поймать исключение. Необработанная ошибка из такого метода часто уходит в контекст окна и может завершить процесс.

Поэтому async void оставляют для обработчиков событий окна, где делегат обязан быть void: кнопка, таймер. Остальную логику пишут как async Task.

Типичный обработчик щелчка ничего не возвращает, поэтому его помечают async void. Вызывающий код не получает задачу и не ждёт окончания. Сначала печатается 1, затем, когда пауза в обработчике кончится, строка "clicked". Без финальной паузы процесс мог бы закрыться раньше этого сообщения:

async void OnClick() { await Task.Delay(10); Console.WriteLine("clicked"); // выведет "clicked" } OnClick(); Console.WriteLine(1); // выведет 1 await Task.Delay(50);

Сделайте обработчик без возвращаемой задачи: после короткой паузы он выводит "saved". Вызовите его и следом выведите "main".

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить