'main'和'async main'之间有什么区别?

27 浏览
0 Comments

'main'和'async main'之间有什么区别?

这里有两个函数static int Main()static async Task Main()

有人能告诉我它们之间有什么区别吗?

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

关键之处是await

0
0 Comments

没有,这是我自己的理解。

0
0 Comments

在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/

0
0 Comments

主要区别只是外观上的差异。虽然我找不到调用main的代码示例,但规范说明了这个特性只是为了移除“样板代码”。因此,实现类似于以下代码:

static int Main()  // 编译器生成的代码
{
    return Main().GetAwaiter().GetResult();
}
static async Task Main()
{
    return await DoAsyncWork();
}

这段代码中,我们可以看到两个版本的`Main`方法。第一个版本是编译器生成的,它调用了第二个版本的`Main`方法,并使用`GetAwaiter().GetResult()`来等待异步操作完成并返回结果。

这样做的目的是为了简化异步代码的编写。使用`async main`可以使我们直接在`Main`方法中使用异步操作,而不需要在编写其他辅助方法来处理异步逻辑。

总之,`main`和`async main`之间的主要区别在于后者支持直接在`Main`方法中使用异步操作,从而简化了异步代码的编写。

0