使用异步Main的目的是什么?

18

众所周知,C#7允许将Main()函数异步化。

它有哪些优势呢?在什么情况下可以使用async Main而不是普通的Main函数呢?


4
如果你想正确地等待某些内容,async并不会很好地组合在一起,因为你需要将自己的方法也设为async。这就像乌龟堆叠在一起一样,如果Main()方法也是这样做的话,那就有点麻烦了。 - Hans Passant
1个回答

26

实际上是C# 7.1引入了async main。

其目的是为了处理在Main方法直接调用一个或多个异步方法的情况。在C# 7.1之前,您必须在主方法中引入某种程度的仪式感,例如通过SomeAsyncMethod().GetAwaiter().GetResult()来调用这些异步方法。

通过将Main标记为async,可以简化这种仪式感,例如:

static void Main(string[] args) => MainAsync(args).GetAwaiter().GetResult();

static async Task MainAsync(string[] args)
{
    await ...
}

成为:

static async Task Main(string[] args)
{
    await ...
}

有关使用此功能的良好撰写,请参见C# 7系列,第2部分:Async Main


1
他们似乎多次改变了主意。https://dev59.com/EGox5IYBdhLWcg3wcT3r#9212343 一开始允许,然后禁止,然后又允许了,嗯。知道背后的原因会很有趣。 - M.kazem Akhgary
1
@David - 我不理解的是,考虑到控制权在等待时会返回给调用者,为什么尽管有异步主函数,控制台应用程序仍然在任何执行完成之前就退出了...? - Howiecamp
7
"async main" 的内部实现只是一个同步的包装器,它使用 .Wait() 方法。 - Austin Salgat
1
@Salgat 非常好的观点!我查看了使用最新C#语言功能的.NET Core 2.2控制台应用程序生成的IL代码,发现其中有一个void Main方法,在异步Main中调用GetAwiater().GetResult()。但是我仍然很感激不必亲自编写这个部分 :-) - Sudhanshu Mishra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接