这里我有两个函数static int Main()
和static async Task<int> Main()
。
谁能告诉我它们之间有什么区别?
static int Main()
{
return DoAsyncWork().GetAwaiter().GetResult();
}
static async Task<int> Main()
{
return await DoAsyncWork();
}
并且是await
.
差异很小,纯粹是化妆品。
虽然我找不到调用 main 的代码示例,但规范指出此功能只是删除了"样板代码"。
所以实现是这样的
static int $Main() // compiler generated
{
return Main().GetAwaiter().GetResult();
}
static async Task<int> Main()
{
return await DoAsyncWork();
}
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
Main 方法是 C# 中程序的主要入口点。主要方法通常有以下几种(重载(:
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"方法 点
解决方法是对操作调用 Wait 或异步等待。 也:
public static void Main(string[] args)
{
BuildWebHost(args).RunAsync().GetAwaiter().GetResult();
}
或:
public static void Main(string[] args)
{
BuildWebHost(args).RunAsync().Wait();
}
就个人而言,我觉得异步主更像是糖果。异步主或带异步的 Main只是使异步操作易于从程序的主条目运行。
参考资料: https://blogs.msdn.microsoft.com/mazhou/2017/05/30/c-7-series-part-2-async-main/
异步避免在主线程中等待长时间运行的操作。使用异步机制,我们可以触发长时间运行的操作并继续执行其他任务。
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);
}
static int main(( 是一个同步方法,这意味着你的线程从你请求完成的工作到完成工作的点必须不做任何其他事情。
静态异步 Task main(( 是一个异步方法,这意味着您的线程告诉该方法它需要完成工作,该方法将完成工作并在完成时告诉您