Когда будет ожидание выхода из программы? - PullRequest
2 голосов
/ 01 ноября 2019

Я читал следующий пост , особенно этот пункт:

О методе точки входа вашего приложения, например, Main. Когда вы ожидаете экземпляр, который еще не завершен, выполнение возвращается к вызывающему методу. В случае с Main это вернулось бы из Main, фактически завершив программу.

Я пытался это сделать, но не могу заставить его выйти. Вот код, который у меня есть:

class Program
{
    // ending main!!!
    static async Task Main(string[] args)
    {
        Task<Task<string>> t = new Task<Task<string>>(async () =>
        {
            Console.WriteLine("Synchronous");
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine("Synchronous");
                Console.WriteLine("Synchronous I is: " + i);
                await Task.Run(() => { Console.WriteLine("Asynchronous"); });
                await Task.Run(() => { for (int j = 0; j < 1000; j++) { Console.WriteLine( "Asynchronous, program should have exited by now?"); }});
            }
            return "ASD";
        });
        t.Start();
        await t;
    }
}

Что именно мне здесь не хватает? Не должна ли программа завершить работу при нажатии на строку await t; или при следовании через нить в await Task.Run(() => { Console.WriteLine("Asynchronous"); });?

Это основной метод Консольного приложения.

1 Ответ

4 голосов
/ 01 ноября 2019

Статья, на которую вы ссылаетесь, относится к 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()), до выхода из программы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...