原文:https://blogs.msdn.microsoft.com/mazhou/2017/05/30/c-7-series-part-2-async-main/ 你大概知道,C#語言可以構建兩種程式。一種是帶有入口點(entrypoint)的程式,這樣操作系統就可以載入程式並從入口點執行;另一 ...
原文: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。
系列文章: