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

async void

async void нельзя await. Код до первого await выполняется сразу в вызывающем потоке. После await Task.CompletedTask продолжение может пойти иначе. Такой метод не используют для бизнес-логики - лучше async Task.

Синтаксис

async void Handler() { await Task.CompletedTask; }

Пример

Давайте записать текст до первого await:

using System; using System.IO; using System.Threading.Tasks; class Program { static async void WriteEarly(StringWriter writer) { writer.Write("abcde"); await Task.CompletedTask; } static async Task Main() { var writer = new StringWriter(); WriteEarly(writer); string res = writer.ToString(); Console.WriteLine(res); } }

Результат выполнения кода:

"abcde"

Пример

Давайте дописать после await и дождаться конца метода:

using System; using System.IO; using System.Threading.Tasks; class Program { static async void WriteBoth(StringWriter writer) { writer.Write("abcde"); await Task.CompletedTask; writer.Write("12345"); } static async Task Main() { var writer = new StringWriter(); WriteBoth(writer); await Task.Delay(TimeSpan.Zero); string res = writer.ToString(); Console.WriteLine(res); } }

Результат выполнения кода:

"abcde12345"

Пример

Давайте проверить, что до await работа видна сразу:

using System; using System.Threading.Tasks; class Program { static async void Mark(ref bool seen) { seen = true; await Task.CompletedTask; } static async Task Main() { bool seen = false; Mark(ref seen); Console.WriteLine(seen); } }

Результат выполнения кода:

True

Смотрите также

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