Esse é o 11º post da série sobre C# 7, e o primeiro sobre C# 7.1. Pra acompanhar a série você pode seguir a tag C#7 no blog ou voltar no post que agrega a série.

Lembrando que para utilizar as versões minor do C# (como a 7.1, ou 7.2) você precisa habilitá-la nos atributos do projeto. Veja neste post como fazê-lo e também como habilitar na solution inteira pra não ter que ficar configurando cada projeto individualmente.

Novidades do C# 7.1: Async Main

A partir da versão 7.1 o entry point da sua aplicação pode ser assíncrono. Ou seja, o método Main, que normalmente retorna void e não pode ter a palavra chave async, a partir desta versão, pode ser assíncrono.

Nesse caso, você é obrigado a retornar Task ou Task<int> (você não pode retornar void se o método estiver marcado como async).

Isso facilita muito. Antes, o que normalmente eu fazia era criar um método MainAsync e chamar .Wait(), o que não é mais necessário. Veja como ficava:

static void Main(string[] args)
{
    MainAsync().Wait();
}
static async Task MainAsync()
{
    //faça algo assíncrono, por exemplo, ler e escrever um arquivo
    WriteLine(await File.ReadAllTextAsync(@"c:\temp\foo.txt"));
}

E como ficou:

static async Task Main(string[] args)
{
    //faça algo assíncrono, por exemplo, ler e escrever um arquivo
    WriteLine(await File.ReadAllTextAsync(@"c:\temp\foo.txt"));
}

Você poderia também retornar o valor de saída 1 caso o arquivo não exista, usando Task<int>, ficaria assim:

static async Task<int> Main(string[] args)
{
    if (!File.Exists(@"c:\temp\foo.txt"))
        return 1;
    WriteLine(await File.ReadAllTextAsync(@"c:\temp\foo.txt"));
    return 0;
}

Lembrando que se você esquecer de habilitar o C# 7.1 receberá o erro CS8107:

error CS8107: Feature 'async main' is not available in C# 7.0. Please use language version 7.1 or greater.

Você consegue ler sobre async main nos docs sobre o Main.

Giovanni Bassi

Arquiteto e desenvolvedor, agilista, escalador, provocador. É fundador e CSA da Lambda3. Programa porque gosta. Acredita que pessoas autogerenciadas funcionam melhor e por acreditar que heterarquia é mais eficiente que hierarquia. Foi reconhecido Microsoft MVP há mais de dez anos, dos mais de vinte que atua no mercado. Já palestrou sobre .NET, Rust, microsserviços, JavaScript, TypeScript, Ruby, Node.js, Frontend e Backend, Agile, etc, no Brasil, e no exterior. Liderou grupos de usuários em assuntos como arquitetura de software, Docker, e .NET.