C#   -  Usando Async Main


Hoje vamos discutir a utilização do Async Main na linguagem C#.

Existem dois tipos de programas que o compilador de linguagem C# pode criar :

  1. Um programa com um ponto de entrada para que o sistema operacional possa carregar o programa e executá-lo a partir do ponto de entrada. Aqui estão incluídos os programas Windows Forms, UWP, Console, WPF, ASP .NET, ASP .NET Core e Xamarin;
     
  2. Um programa sem um ponto de entrada. O sistema operacional não pode executar diretamente esse tipo de programa. Esse tipo de programa precisa ser referenciado por outros programas que possuem um ponto de entrada. Aqui temos os programas do tipo Class Library;

O método Main no C#

Um programa na linguagem C# é iniciado no método Main com as seguintes propriedades.

Existem quatro versões sobrecarregadas que são consideradas assinaturas válidas para o método Main em C# :


    public static void Main();
    public static int Main();
    public static void Main(string[] args);
    public static int Main(string[] args);

 

Antes da versão 7.1 do C#, quando queríamos chamar o método assíncrono de dentro do método Main(), precisávamos adicionar algum código, mas agora o compilador C# faz isso por nós.

Vamos entender como chamar o método assíncrono Main em C# antes da versão 7.1 com um exemplo:

       static void Main(string[] args)
        {
            Console.WriteLine("Antes do C# 7.1, Para usar o método async");
            Console.WriteLine($"Execução do Main iniciou em : {System.DateTime.Now}");

            Task.Delay(2000).GetAwaiter().GetResult();

            Console.WriteLine($"Execução do Main terminou em : {System.DateTime.Now}");
            Console.ReadKey();
        }

Resultado obtido:

Assim o ponto de entrada , ou método Main não podia ser assíncrono.

É claro que você podia driblar essa limitação criando um outro método assíncrono chamando Wait:

Mas agora isso não é mais necessário....

Como ficou o Main assíncrono a partir do C# 7.1 ?

A partir da versão 7.1, o método Main(), que é o ponto de entrada do aplicativo, pode ser declarado como assíncrono (async)

Antes da versão 7.1, o método Main() podia ter um tipo de retorno como void ou int; no entanto, agora, ele também suporta os tipos Task e Task<int>.

Portanto, agora temos oito versões de sobrecarga consideradas como assinaturas válidas para o método 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);
 

E agora podemos fazer assim:

No código acima estamos incluindo um atraso de 2 segundos ao programa com Task.Delay(2000), e, estamos usando await e async no método Main.

Assim, a sintaxe na versão 7.1 é mais simples e fácil de usar. No exemplo acima, vemos como podemos usar Task com Main

Vejamos a seguir um exemplo usando Task<int> :

using System;
using System.Threading.Tasks;
namespace CShp_MainAsync
{
    class Program
    {
        public static async Task<int> Main(string[] args)
        {
            Console.Title = "Main usando async Task<int>";
            int numero1 = 15, numero2 = 20;
            Console.WriteLine($"Soma de {numero1} com {numero2} = " +
                         $"{await SomarAsync(numero1, numero2)}");
            Console.ReadKey();
            return 0;
        }

        private static Task<int> SomarAsync(int n1, int n2)
        {
            return Task.Run(() => Somar(n1, n2));
            //função local
            int Somar(int x, int y)
            {
                return x + y;
            }
        }
    }
}    

Resultado obtido:

Neste código estamos usando async e await no método Main com Task<int>, chamando um método assíncrono onde definimos uma função local que é um dos novos recursos do C# 7.0.

Aguarde mais artigos sobre a linguagem C#.

"E este evangelho do reino será pregado em todo o mundo, em testemunho a todas as nações, e então virá o fim."
Mateus 24:14

Referências:


José Carlos Macoratti