C#:在控制台应用程序的 Main 中调用异步方法导致编译失败

C#: call async method inside Main of console application leads to compilation failure

我有一个非常简单的代码片段,用于测试如何在 Main() 中调用 Task<> 方法

using System;
using System.Threading;
using System.Threading.Tasks;
class Program
{
    private static async Task<int> F1(int wait = 1)
    {
        await Task.Run(() => Thread.Sleep(wait));
        Console.WriteLine("finish {0}", wait);
        return 1;
    }

    public static async void Main(string[] args)
    {
        Console.WriteLine("Hello World!");
        var task = F1();
        int f1 = await task;
        Console.WriteLine(f1);
    }
}

无法编译因为:

(1) F1 是异步的,所以 Main() 必须是 "async".

(2) 编译器说:

error CS5001: Program does not contain a static 'Main' method suitable for an entry point

所以如果我删除 Main 的 "async",编译器会说:

error CS4033: The 'await' operator can only be used within an async method. Consider marking this method with the 'async' modifier and changing its return type to 'Task'.

我可以在此处添加或删除 "async" 关键字。如何让它发挥作用?非常感谢。

您的 Main 方法不符合列出的有效签名之一 here

你可能想用这个:

public static async Task Main(string[] args)

需要返回一个Task,以便运行时知道方法何时完成; void.

无法确定

编译器通过生成合成入口点实现此目的:

private static void $GeneratedMain(string[] args) => 
    Main(args).GetAwaiter().GetResult();