这里有两个功能static int Main()
和static async Task<int> Main()
。
谁能告诉我他们之间有什么区别?
static int Main()
{
return DoAsyncWork().GetAwaiter().GetResult();
}
static async Task<int> Main()
{
return await DoAsyncWork();
}
并且是await
。
答案 0 :(得分:4)
差异很小,purely cosmetic。
虽然我找不到调用main the specification的代码示例,但声明该功能只是删除了“样板代码”。
因此实现类似于
static int $Main() // compiler generated
{
return Main().GetAwaiter().GetResult();
}
static async Task<int> Main()
{
return await DoAsyncWork();
}
答案 1 :(得分:1)
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
答案 2 :(得分:1)
Main方法是C#中Program的主要入口点。主要方法通常有以下几种口味(重载):
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();
}
我个人认为异步主要是糖果。 异步main或Main with async 只是使异步操作易于从程序的主条目运行。
此处参考:https://blogs.msdn.microsoft.com/mazhou/2017/05/30/c-7-series-part-2-async-main/
答案 3 :(得分:1)
异步避免了长时间运行的操作在主线程中等待。使用异步机制,我们可以触发长时间运行的操作并继续执行其他任务。
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);
}
答案 4 :(得分:1)
static int main()是一个同步方法,这意味着从您请求完成工作的那一刻起直到完成它的那一刻,您的线程都不能做其他任何事情。
静态异步任务main()是一个异步方法,这意味着您的线程告诉该方法它需要完成工作,并且该方法将完成工作并告诉您完成的时间