Статья, на которую вы ссылаетесь, относится к 2012 году, предшествующему добавлению асинхронной поддержки в Main (), поэтому то, о чем она говорит, кажется неправильным.
Для текущей реализации рассмотрите следующий код:
public static async Task Main()
{
Console.WriteLine("Awaiting");
await Task.Delay(2000);
Console.WriteLine("Awaited");
}
Это преобразуется компилятором следующим образом (я использовал "JustDecompile" для декомпиляции этого):
private static void <Main>()
{
Program.Main().GetAwaiter().GetResult();
}
public static async Task Main()
{
Console.WriteLine("Awaiting");
await Task.Delay(2000);
Console.WriteLine("Awaited");
}
Теперь вы можете понять, почему программа не't выход.
async Task Main()
вызывается из static void <Main>()
, ожидающего завершения Task
, возвращенного из async Task Main()
(путем доступа к .GetResult()
), до выхода из программы.