Async void в C#: Его опасности и почему он все еще существует

Deda_Sher 22 минуты назад Async void в C#: Его опасности и почему он все еще существует Средний 8 мин 508 C# * .NET * Программирование * Туториал ВведениеВ марте 2026 года я проходил техническое собеседование в компанию...
<5 — 2026'da uzaya kaç SpaceX Starship fırlatması ulaşacak?
Значимый прорыв формирует отрасль ИИ: Deda_Sher 22 минуты назад Async void в C#: Его опасности и почему он все еще существует Средний 8 мин 508 C# * . NET * Программирование * Туториал ВведениеВ марте 2026 года я проходил техническое собеседование в компанию «Северсталь‑инфоком» на позицию стажера разработчика C#. На нем мне задавали много интересных вопросов по разным темам и фичам языка.
Когда мы обсуждали асинхронность, мой интервьюер на интерес спросил у меня, можно ли написать async void и скомпилируется ли такой код? Сказать, что этот вопрос поставил меня в тупик — это ничего не сказать. Я знал про конструкции async Task и async ValueTask, но никак не про async void.
Технические детали
Я ответил, что не знаю и мы пошли дальшеКак выяснилось позже, эта конструкция не только компилируется, но и таит в себе бомбу замедленного действия. Сегодня я хочу закрыть этот гештальт и подробно разобрать, что такое async void, чем он отличается от async Task, в каких сценариях он разрешен, а в каких — смертельно опасен. Быстрое погружениеПрежде чем нырять в пучину async void, давайте на пару минут вернемся к базе, чтобы убедиться, что мы говорим на одном языке.
async — это ключевое слово‑модификатор. Оно говорит компилятору, что внутри данного метода будут ожидания и его надо превратить в конечный автомат. Сам по себе async не запускает отдельный поток, а лишь позволяет методу приостанавливать свое выполнение в точках await.
await — это оператор ожидания. Он приостанавливает выполнение текущего метода до тех пор, пока ожидаемая операция не завершится, и отдает управление обратно вызывающему коду. После завершения операции метод возобновляется с того же места Task / ValueTask — это контракт, который говорит, что оборачиваемая им операция выполнится когда‑то потом.
Отраслевые последствия
Этот объект представляет собой асинхронную операцию. У него внутри есть некоторая метаинформация, с помощью которой вызывающий код отслеживает состояние: завершена операция, выполняется или упала с ошибкой. Task vs VoidПосмотрим на вот такой обычный асинхронный код:Console.
WriteLine("Program started await ProcessAsync(); Console. WriteLine("Program finished async Task ProcessAsync() { Console. WriteLine("Processing...
Delay(2000); Console. WriteLine("Process completed }Такой код выводит следующее:Program started Processing... Process completed Program finishedПопробуем теперь заменить Task на void и посмотрим как поменяется код и его вывод.
Событие, по словам экспертов, усилит конкуренцию в сфере ИИ.






