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-метода