'main'和'async main'之间有什么区别?
在C#中,Main方法是程序的主要入口点。Main方法通常有以下几种重载形式:
public static void Main(string[] args); public static int Main(string[] args); public static void Main(); public static int Main();
其中,返回类型为int的形式通常在需要评估返回值的本地环境中使用。
现在,我们来看看'async main'。以下代码是无效的:
public static async Task Main(string[] args)
并且会在编译时抛出错误:
Program does not contain a static 'Main' method suitable for an entry
point
解决方法是调用Wait或async wait来等待操作完成。
方法一:
public static void Main(string[] args) { BuildWebHost(args).RunAsync().GetAwaiter().GetResult(); }
方法二:
public static void Main(string[] args) { BuildWebHost(args).RunAsync().Wait(); }
个人认为,async main更像是一种糖果。使用async main或Main方法加上async可以方便地从程序的主要入口点运行异步操作。
参考链接:https://blogs.msdn.microsoft.com/mazhou/2017/05/30/c-7-series-part-2-async-main/
主要区别只是外观上的差异。虽然我找不到调用main的代码示例,但规范说明了这个特性只是为了移除“样板代码”。因此,实现类似于以下代码:
static int Main() // 编译器生成的代码 { return Main().GetAwaiter().GetResult(); } static async TaskMain() { return await DoAsyncWork(); }
这段代码中,我们可以看到两个版本的`Main`方法。第一个版本是编译器生成的,它调用了第二个版本的`Main`方法,并使用`GetAwaiter().GetResult()`来等待异步操作完成并返回结果。
这样做的目的是为了简化异步代码的编写。使用`async main`可以使我们直接在`Main`方法中使用异步操作,而不需要在编写其他辅助方法来处理异步逻辑。
总之,`main`和`async main`之间的主要区别在于后者支持直接在`Main`方法中使用异步操作,从而简化了异步代码的编写。