[译]C# 7系列,Part 2: Async Main

原文: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

系列:

[译]C# 7系列,Part 1: Value Tuples

原文地址:https://www.cnblogs.com/wenhx/p/csharp-7-series-part-2-async-main.html

时间: 2024-11-08 22:44:14

[译]C# 7系列,Part 2: Async Main的相关文章

[译]C# 7系列,Part 5: private protected 访问修饰符

原文:https://blogs.msdn.microsoft.com/mazhou/2017/10/05/c-7-series-part-5-private-protected/ C#有几个可访问性修饰符,public.internal.internal protected和private. public: 具有此可访问性声明的成员可以在此成员所在程序集中或引用该成员所在程序集的任何其他程序集中可见.也就是说,访问不受限制. internal:具有此可访问性声明的成员可以在此成员所在程序集中可

[译]C# 7系列,Part 7: ref Returns ref返回结果

原文:https://blogs.msdn.microsoft.com/mazhou/2017/12/12/c-7-series-part-7-ref-returns/ 背景 有两种方法可以将一个值传递给一个方法: 按值传递.当一个参数被传递给一个方法时,一个参数的副本(如果它是一个值类型)或一个"参数引用"的副本(如果它是一个引用类型)被传递.当您更改方法中的参数时,更改(单个赋值或复合赋值)会反映到参数/"参数引用"的副本,而不会反映到参数或“参数引用”本身.这

[译]C# 7系列,Part 8: in Parameters in参数

原文:https://blogs.msdn.microsoft.com/mazhou/2018/01/08/c-7-series-part-8-in-parameters/ 背景 默认情况下,方法参数是通过值传递的.也就是说,参数被复制并传递到方法中.因此,修改方法体中的参数不会影响原始值.在大多数情况下,修改是不必要的. 其他编程语言,如C++,有一个const参数或类似的概念:这表明方法体中的参数是一个不能被重新赋值的常量.它有助于避免在方法体内无意中重新赋值一个方法参数的错误,并通过不允许

[译]C# 7系列,Part 9: ref structs ref结构

原文:https://blogs.msdn.microsoft.com/mazhou/2018/03/02/c-7-series-part-9-ref-structs/ 背景 在之前的文章中,我解释了许多新的C#特性,每一个特性都是为了增强语言或者解决问题而引入的.具体来说,我解释了值类型和引用类型.按值传递参数.按引用传递参数.ref局部变量和ref返回结果以及in参数.这其中许多功能是为高性能场景设计的. ref和in参数可以帮助避免复制值,从而减少内存分配.当你有分配在堆栈的局部变量作为方

[译]C# 7系列,Part 1: Value Tuples

Mark Zhou写了很不错的一系列介绍C# 7的文章,虽然是2年多年前发布的,不过对于不熟悉C# 7特性的同学来说,仍然有很高的阅读价值. 原文:https://blogs.msdn.microsoft.com/mazhou/2017/05/26/c-7-series-part-1-value-tuples/ 译文: 从今天开始,我将开始一个新的C# 7系列文章,介绍C# 7+的新语言特性.请注意,我说的不是C# 7.0,我说的是C# 7+,因为将会有一些小的版本(比如7.1.7.2)逐步引入

[译]GC专家系列2:Java 垃圾回收的监控

原文链接:http://www.cubrid.org/blog/dev-platform/how-to-monitor-java-garbage-collection/ 这是"成为GC专家系列"文章的第二篇.在第一篇理解Java垃圾回收中我们学习了几种不同的GC算法的处理过程,GC的工作方式,新生代与老年代的区别.到目前为止,你应该已经了解了JDK 7中的5种GC类型,以及每种GC对性能的影响. 在本篇中,我将介绍JVM在真实环境中如何运行GC的. 什么是GC监控 GC监控 指的是在运

[译] C# 5.0 中的 Async 和 Await (整理中...)

C# 5.0 中的 Async 和 Await [博主]反骨仔 [本文]http://www.cnblogs.com/liqingwen/p/6069062.html 伴随着 .NET 4.5 和 Visual Studio 2012 的 C# 5.0 ,我们可以使用的新的异步模式,这里涉及到 async 和 await 关键字.有许多不同点的观点,比起之前我们所看到的代码,它的可读性和实用性是否更加突出.我们将通过一个例子,看看它与当前的做法有何“与众不同”. 线性代码与非线性代码 大部分的软

【译】STM32L4x6系列用户手册第四章 - 防火墙(FireWall)

4        防火墙(FW) 4.1        简介 防火墙用于保护非易失性存储器中的特定部分的代码或数据,和/或保护SRAM1中的易失性数据,免受在保护区域外部执行的其余代码的非法访问. 4.2        防火墙的主要功能 •        防火墙保护的代码(代码段)可能位于: –        Flash存储器 –        SRAM1存储器,如果在防火墙配置步骤中被声明为可执行保护区域. •        要保护的数据也可以位于 –        Flash存储器中(非易失

[译]GC专家系列1: 理解Java垃圾回收

原文链接:http://www.cubrid.org/blog/dev-platform/understanding-java-garbage-collection/ 了解Java的垃圾回收(GC)原理能给我们带来什么好处?对于软件工程师来说,满足技术好奇心可算是一个,但重要的是理解GC能帮忙我们更好的编写Java应用程序. 上面是我个人的主观的看法,但我相信熟练掌握GC是成为优秀Java程序员的必备技能.如果你对GC执行过程感兴趣,也许你只是有一定的开发应用的经验:如果你仔细考虑过如何选择合适