Опасность 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".