“ main”和“ async main”有什么区别?

时间:2018-09-20 06:15:00

标签: c# async-await c#-7.1

这里有两个功能static int Main()static async Task<int> Main()

谁能告诉我他们之间有什么区别?

static int Main()
{
    return DoAsyncWork().GetAwaiter().GetResult();
}

static async Task<int> Main()
{
    return await DoAsyncWork();
}

并且是await

5 个答案:

答案 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()是一个异步方法,这意味着您的线程告诉该方法它需要完成工作,并且该方法将完成工作并告诉您完成的时间