原文:https://blogs.msdn.microsoft.com/mazhou/2017/05/30/c-7-series-part-2-async-main/

你大概知道,C#语言可以构建两种程序。一种是带有入口点(entrypoint)的程序,这样操作系统就可以加载程序并从入口点执行;另一个是没有入口点的程序。操作系统不能直接执行程序,程序可以被其他有入口点的程序引用,这样就可以执行其中的代码。

必须有入口点的应用程序类型有:Windows Forms应用程序、UWP应用程序、控制台应用程序、WPF应用程序、ASP.NET和ASP.NET Core应用程序和Xamarian App。

不需要入口点的应用程序类型有:类库(/t:lib)、模块(/t:module)。

Main方法

像其他语言一样,C#程序从Main方法开始。有四个重载被认为是Main方法的有效签名。

public static void Main();
public static int Main();
public static void Main(string[] args);
public static int Main(string[] args);

C#的入口点方法必须是静态的,方法名必须是Main,这个方法的返回类型可以是void或者int,它可以有一个字符串数组的参数,包含任何命令行参数。

如果入口点方法返回一个int值,那么操作系统或使用此入口点启动程序的宿主进程可以评估这个返回值,这在本机环境(译注:与.NET的托管环境相对应)中广泛使用(比如表示外部应用程序的成功启动)。

异步的Main方法

C#在5.0版本(.NET Framework 4.5)中引入了异步/等待模式,使得异步操作的流程易于读懂。许多现有的,为那些异步操作(又名异步编程模型)设计的语言结构可以使用新的async/await关键字。今天,社区开发的许多类库只提供了异步版本的操作。(例如,System.Net.HttpClient, Microsoft.Azure.EventHub.Core.)

正如我在前面所提到的,如果你想在Main方法中等待异步操作,你需要应用一些变通方法,因为下面的Main方法定义是无效的(译注:在C#7.1之前的版本):

public static async Task Main(string[] args)
{
await BuildWebHost(args).RunAsync();
}

变通的办法是使用同步等待操作。

public static void Main(string[] args)
{
BuildWebHost(args).RunAsync().GetAwaiter().GetResult();
}

或者调用定义在Task的Wait()方法:

public static void Main(string[] args)
{
BuildWebHost(args).RunAsync().Wait();
}

在C# 7.1中,C#扩展了Main方法的有效签名,允许这些Main法的异步重载有效。

public static void Main();
public static int Main();
public static void Main(string[] args);
public static int Main(string[] args);
public static Task Main();
public static Task<int> Main();
public static Task Main(string[] args);
public static Task<int> Main(string[] args);

类Task的返回类型允许在Main方法使用async修饰符来实现await关键字。

结论

异步的Main方法使得入口点方法中的异步操作更容易使用,而不需要像在其他异步方法中运行那样使用任何变通方法。在代码编译的时候,任何异步Main方法都将被包装成一个可以被CLR宿主接受的非异步Main方法。由于这个新特性不需要CLR代码更改,所以异步Main方法其实只是一个语法糖。这样的设计允许后端与C#以前的版本兼容。要阅读更多的细节,请参阅Roslyn(译注:C#编译器)源代码仓库里的一篇文章:Aysnc Main

系列文章:

最新文章

  1. T-SQL备忘-表连接更新
  2. RDLC隔行变色的实现
  3. 网站整站下载工具—HTTrack Website Copier
  4. Javascript DOM编程艺术 2宿主对象
  5. Python 基礎 - 列表的使用
  6. java多线程详解(4)-多线程同步技术与lock
  7. Shell 变量
  8. Collection List Set和Map用法与区别
  9. php实现多线程
  10. C#中A a=new B()的意义
  11. 国外NET 空间免费申请使用
  12. edittext实现粘贴表情
  13. intro
  14. Android 常用动画小结
  15. TypeScript 异步代码类型技巧
  16. 在.NET Core类库中使用EF Core迁移数据库到SQL Server
  17. July 07th. 2018, Week 27th. Saturday
  18. Swift Write to file 到电脑桌面
  19. 简单总结下opacity、transparent以及rgba
  20. CentOS 6.8 防火墙配置

热门文章

  1. JSON的使用场景及注意事项介绍
  2. TensorFlow2.0极简安装(亲测有效)
  3. vue 结合 Echarts 实现半开环形图
  4. java中关键字volatile的作用(转载)
  5. 用 python 分析基金!让赚钱赢在起跑线!
  6. PHP和JavaScript中奖概率算法
  7. 点击按钮每次都能实现图片的旋转和切换(swift)
  8. 在 Linux 部署多节点 Kubernetes 集群与 KubeSphere 容器平台
  9. 复选框、单选框样式自定义(https://www.cnblogs.com/freedom-feng/p/11346396.html)
  10. Python中的Tcp协议的应用之Tcp服务端程序开发