В чем разница между "основным" и "асинхронным основным"?
Здесь у меня есть две функции static int Main()
а также static async Task<int> Main()
,
Может кто-нибудь сказать мне, в чем разница между ними?
static int Main()
{
return DoAsyncWork().GetAwaiter().GetResult();
}
static async Task<int> Main()
{
return await DoAsyncWork();
}
и является await
,
5 ответов
Разница небольшая и чисто косметическая.
Хотя я не смог найти пример кода, который вызывает main, в спецификации говорится, что эта функция просто удаляет "код котельной пластины".
Так что реализация что-то вроде
static int $Main() // compiler generated
{
return Main().GetAwaiter().GetResult();
}
static async Task<int> Main()
{
return await DoAsyncWork();
}
Async Main на самом деле не метод, который запускается первым. Компилятор генерирует стандарт Main
метод, который вызывает асинхронную версию Main
:
static async Task Main(string[] args)
{
await Task.Delay(1);
Console.ReadLine();
}
// This gets generated by the compiler.
static void Main(string[] args)
{
Main(args).GetAwaiter.GetResult();
}
Так что разница в том, что при использовании async Main
есть два метода Main
, Один асинхронный и один сгенерированный компилятором.
Поскольку эти два метода имеют одинаковые имя и параметры и отличаются только типом возвращаемого значения, компилятор генерирует метод с именем <Main>
не Main
, Это сгенерированная подпись:
.method private hidebysig specialname static
void '<Main>' (
string[] args
) cil managed
Основной метод - главная точка входа Программы в C#. Основной метод обычно имеет следующие разновидности (перегрузки):
public static void Main(string[] args);
public static int Main(string[] args);
public static void Main();
public static int Main();
'Int' обычно используются в родном мире, где необходимо оценить возвращаемое значение.
Теперь перейдем к "асинхронной магистрали". Следующее недействительно:
public static async Task Main(string[] args)
и выдаст ошибку времени компиляции:
Программа не содержит статического метода Main, подходящего для точки входа
Обходной путь - либо вызвать Wait, либо выполнить асинхронное ожидание операции. Или:
public static void Main(string[] args)
{
BuildWebHost(args).RunAsync().GetAwaiter().GetResult();
}
Или же:
public static void Main(string[] args)
{
BuildWebHost(args).RunAsync().Wait();
}
Лично я чувствую, что асинхронное главное - это скорее конфетка. Async main или Main с async просто позволяет легко запускать асинхронные операции из основной записи программы.
Ссылка здесь: https://blogs.msdn.microsoft.com/mazhou/2017/05/30/c-7-series-part-2-async-main/
static int main() - это синхронный метод, означающий, что ваш поток не должен делать ничего другого с момента, когда вы запрашиваете выполнение работы, до момента, когда она выполнена.
static async Task main () - это асинхронный метод, означающий, что ваш поток сообщает методу, что ему нужно выполнить работу, а метод завершит работу и сообщит вам, когда она будет завершена.
async позволяет избежать ожидания в главном потоке при длительных операциях. Используя асинхронный механизм, мы можем просто запускать длительные операции и продолжать выполнение других задач.
public async Task<int> ExampleMethodAsync()
{
await httpClient.GetStringAsync(requestUrl);
}
Метод Main является точкой входа в приложение C#. (Для библиотек и служб не требуется метод Main в качестве точки входа.) Когда приложение запускается, метод Main является первым вызываемым методом.
static void Main(string[] args)
{
// Display the number of command line arguments:
System.Console.WriteLine(args.Length);
}