[譯]C# 7系列,Part 2: Async Main 異步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

 

系列文章:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章