【问题标题】:What is the difference between 'main' and 'async main'?“主”和“异步主”有什么区别?
【发布时间】:2023-03-08 20:50:01
【问题描述】:
这里我有两个函数static int Main()和static async Task<int> Main()。
谁能告诉我它们有什么区别?
static int Main()
{
return DoAsyncWork().GetAwaiter().GetResult();
}
static async Task<int> Main()
{
return await DoAsyncWork();
}
并且是await。
【问题讨论】:
标签:
c#
async-await
c#-7.1
【解决方案1】:
和purely cosmetic的差别很小。
虽然我找不到调用 main the specification 的代码示例,但声明此功能只是删除了“样板代码”。
所以实现类似于
static int $Main() // compiler generated
{
return Main().GetAwaiter().GetResult();
}
static async Task<int> Main()
{
return await DoAsyncWork();
}
【解决方案2】:
Async Main 实际上并不是首先运行的方法。编译器生成标准的Main 方法,该方法调用Main 的异步版本:
static async Task Main(string[] args)
{
await Task.Delay(1);
Console.ReadLine();
}
// This gets generated by the compiler.
static void Main(string[] args)
{
Main(args).GetAwaiter.GetResult();
}
所以不同的是,在使用async Main时,有两个方法叫Main。一个异步,一个由编译器生成。
由于这两个方法具有相同的名称和参数,并且仅在返回类型上有所不同,因此编译器生成的方法名称为<Main>,而不是Main。这是生成的签名:
.method private hidebysig specialname static
void '<Main>' (
string[] args
) cil managed
【解决方案3】:
Main方法是C#程序的主要入口点。 Main 方法通常有以下几种形式(重载):
public static void Main(string[] args);
public static int Main(string[] args);
public static void Main();
public static int Main();
'int' 是原生世界中通常使用的,需要计算返回值的地方。
现在,进入“异步主程序”。以下无效:
public static async Task Main(string[] args)
并且会抛出编译时错误:
程序不包含适用于条目的静态“Main”方法
点
解决方法是对操作调用等待或异步等待。
要么:
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 with async 只是使异步操作易于从程序的主入口运行。
参考这里:https://blogs.msdn.microsoft.com/mazhou/2017/05/30/c-7-series-part-2-async-main/
【解决方案4】:
异步避免了在主线程中等待长时间运行的操作。使用异步机制,我们可以触发长时间运行的操作并继续执行其他任务。
public async Task<int> ExampleMethodAsync()
{
await httpClient.GetStringAsync(requestUrl);
}
Main 方法是 C# 应用程序的入口点。 (库和服务不需要 Main 方法作为入口点。)当应用程序启动时,Main 方法是第一个被调用的方法。
static void Main(string[] args)
{
// Display the number of command line arguments:
System.Console.WriteLine(args.Length);
}
【解决方案5】:
static int main() 是一种同步方法,这意味着您的线程必须从您请求完成工作的那一点到完成它的那一点做任何其他事情。
static async Task main() 是一个异步方法,意思是你的线程告诉方法它需要完成工作,方法会完成工作并告诉你什么时候完成