نحوهی کار با متدهای async، در متدهای Main نگارشهای پیش از C# 7.1
برای کار با متدهای Async نیاز است از واژهی کلیدی await استفاده شود و با قید این واژه، ضروری است واژهی کلیدی async نیز به امضای متد دربرگیرندهی عملیات اضافه گردد؛ اما در نگارشهای پیشین زبان #C، امکان async تعریف کردن متد Main وجود نداشت. در این حالت میبایستی به صورت ذیل عمل میشد:
static void Main(string[] args) { MainAsync().GetAwaiter().GetResult(); Console.ReadLine(); } private static async Task MainAsync() { using (StreamReader reader = File.OpenText("Program.cs")) { var message = await reader.ReadToEndAsync().ConfigureAwait(false); Console.Write(message); } }
نحوهی کار با متدهای async در متدهای Main برنامههای مبتنی بر C# 7.1
در زبان سیشارپ، متدهای Main برنامههای کنسول میتوانند خروجیهایی از نوع void و int داشته باشند؛ به همراه آرگومانی از نوع []string و یا بدون آرگومان. اکنون در سیشارپ 7.1، دو امضای دیگر نیز به این مجموعه، جهت کار با اعمال Async اضافه شدهاست: async Task و یا <async Task<int
در این حالت مثال قبل را میتوان به صورت ذیل خلاصه کرد:
static async Task Main(string[] args) { using (StreamReader reader = File.OpenText("Program.cs")) { var message = await reader.ReadToEndAsync().ConfigureAwait(false); Console.Write(message); } Console.ReadLine(); }
نگاهی به پشت صحنهی کامپایل async Task Main در C# 7.1
در عمل، کامپایلر سیشارپ جهت حفظ سازگاری با نگارشهای قبلی، مجددا همان متد static void Main را تولید میکند و عملیاتی را که در مورد نگارشهای پیشین توضیح داده شد، تکرار خواهد کرد:
using System; using System.IO; using System.Runtime.CompilerServices; using System.Threading.Tasks; namespace ConsoleCS71 { internal class Program { private static async Task Main(string[] args) { StreamReader reader = File.OpenText("message.txt"); try { string str = await reader.ReadToEndAsync(); string message = str; str = (string)null; Console.Write(message); message = (string)null; } finally { if (reader != null) reader.Dispose(); } reader = (StreamReader)null; Console.ReadLine(); } [SpecialName] private static void <Main>(string[] args) { Program.Main(args).GetAwaiter().GetResult(); } } }
در یک برنامهی سیشارپ میتوان بیش از یک متد Main داشت
تعریف بیش از یک متد Main در برنامههای سیشارپ مجاز است:
namespace ConsoleApp5 { class Class1 { static void Main(string[] args) { } } class Class2 { static void Main(string[] args) { } } }
اما ... اگر دقت کنید، متد async Task Main در اینجا ایندکس نشدهاست که به نظر کمبود نگارش فعلی VS 2017 است.