原文: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 值元組
- [譯]C# 7系列,Part 2: Async Main 異步Main方法 (本文)
- [譯]C# 7系列,Part 3: Default Literals 默認文本運算式
- [譯]C# 7系列,Part 4: Discards 棄元
- [譯]C# 7系列,Part 5: private protected 訪問修飾符
- [譯]C# 7系列,Part 6: Read-only structs 只讀結構
- [譯]C# 7系列,Part 7: ref Returns ref回傳結果
- [譯]C# 7系列,Part 8: in Parameters in引數
- [譯]C# 7系列,Part 9: ref structs ref結構
- [譯]C# 7系列,Part 10: Span<T> and universal memory management Span<T>和統一記憶體管理 (完)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/96193.html
標籤:C#
