首页 > 解决方案 > 等待方法何时退出程序?

问题描述

我一直在阅读以下帖子,特别是这一点:

在您的应用程序的入口点方法上,例如 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"); });吗?

这是控制台应用程序的主要方法。

标签: c#.netmultithreading.net-coretask

解决方案


您链接的文章来自 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");
}

现在您可以看到程序不退出的原因。

async Task Main()程序退出之前static void <Main>()等待Task返回的 fromasync Task Main()完成(通过访问)。.GetResult()


推荐阅读