В чем разница между "основным" и "асинхронным основным"?

Здесь у меня есть две функции 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);
}
Другие вопросы по тегам