Domine async/await no C# 13: melhore desempenho e clareza

Neste tutorial, vamos explorar as melhorias introduzidas no uso de async e await no C# 13O que é C# 13 e por que aprender em 90 minutosO que é C# 13 e por que aprender em 90 minutosExplore as inovações do C# 13 e melhore a legibilidade do seu código. Este tutorial prático de 90 minutos oferece dicas essenciais para desenvolvedores .NET., demonstrando como esses recursos podem tornar sua programação assíncrona ainda mais clara, organizada e performática.

Contextualizando o async/await no C# 13🔗

O modelo de programação assíncrona em C# foi popularizado a partir do C# 5, com a introdução das palavras-chave async e await. Desde então, essas funcionalidades evoluíram para oferecer async streams, await foreach, await using, suporte a Task e ValueTask e muito mais.

No C# 13O que é C# 13 e por que aprender em 90 minutosO que é C# 13 e por que aprender em 90 minutosExplore as inovações do C# 13 e melhore a legibilidade do seu código. Este tutorial prático de 90 minutos oferece dicas essenciais para desenvolvedores .NET., alguns aprimoramentos no compilador e novas convenções de uso prometem:

  • Melhorar a eficiência de métodos assíncronos.
  • Simplificar o diagnóstico de exceções em cenários async complexos.
  • Trazer mais clareza ao empacotamento de tarefas.

Benefícios da Programação Assíncrona🔗

Antes de mergulhar nas melhorias, vale relembrar por que usar programação assíncrona:

1. Desempenho e escalabilidade: ao liberar a thread principal para outras tarefas, seu aplicativo pode processar mais requisições simultaneamente.

2. Responsividade da interfaceTrabalhando com interfaces e coleções aprimoradas em C# 13Trabalhando com interfaces e coleções aprimoradas em C# 13Descubra como as implementações padrão em interfaces e coleções aprimoradas do C# 13 otimizam a criação de códigos modulares, seguros e performáticos.: em aplicações desktop ou mobile, o uso de async/await evita travamentos na UI.

3. Organização do códigoBoas práticas de organização do código em C# 13Boas práticas de organização do código em C# 13Domine as melhores práticas de organização em C# 13. Aprimore a legibilidade e o desempenho do seu código com dicas práticas e exemplos reais.: as async methods facilitam a leitura, em comparação com callbacks aninhados.

Estas características básicas se tornam ainda mais vantajosas com os refinamentos do C# 13O que é C# 13 e por que aprender em 90 minutosO que é C# 13 e por que aprender em 90 minutosExplore as inovações do C# 13 e melhore a legibilidade do seu código. Este tutorial prático de 90 minutos oferece dicas essenciais para desenvolvedores .NET., que permitem maior legibilidade em cenários assíncronos complexos.

Novidades e Aperfeiçoamentos no C# 13🔗

Diagnóstico de Exceções Assíncronas Aprimorado

Uma das melhorias mais notáveis é a forma como o compilador gera e exibe stack traces em exceções decorrentes de métodos assíncronos. Agora, há:

  • Linhas mais descritivas no stack trace, indicando com precisão onde ocorreu o erro dentro de métodos assíncronos.
  • Possibilidade de habilitar logs mais detalhados por meio de atributos especiais, auxiliando na correção de falhas esporádicas.

Exemplo de um método assíncrono que pode gerar exceção:

public async Task ProcessarDadosAsync()
{
    try
    {
        // Imagine uma operação que falha em cenários intermitentes.
        await BuscarDadosDeAPIAsync();
    }
    catch (Exception ex)
    {
        // No C# 13, a stack trace se torna mais clara
        Console.WriteLine($"Erro detectado: {ex.StackTrace}");
        throw;
    }
}
private async Task BuscarDadosDeAPIAsync()
{
    // ...
    throw new InvalidOperationException("Falha simulada.");
}

Simplificações em await foreach e async streams

O suporte nativo a async streams foi introduzido em versões anteriores do C#, permitindo iterar assincronamente sobre coleções de dados que chegam em fluxo. Agora, no C# 13O que é C# 13 e por que aprender em 90 minutosO que é C# 13 e por que aprender em 90 minutosExplore as inovações do C# 13 e melhore a legibilidade do seu código. Este tutorial prático de 90 minutos oferece dicas essenciais para desenvolvedores .NET., o compilador traz:

  • Verificações de nulidade integradas, evitando exceções de NullReference.
  • Sintaxe mais enxuta ao lidar com cancelamentos internos.

Um exemplo prático:

public async IAsyncEnumerable<int> GerarSequenciaAsync(int limite, [EnumeratorCancellation] CancellationToken ct = default)
{
    for (int i = 0; i < limite; i++)
    {
        // Verifica se foi solicitada a parada
        if (ct.IsCancellationRequested)
            yield break;
        // Simula tempo de processamento
        await Task.Delay(100, ct);
        yield return i;
    }
}
public async Task ConsumirSequenciaAsync()
{
    using var cts = new CancellationTokenSource();
    // C# 13: diagnósticos facilitados e checagens nulas aprimoradas
    await foreach (var numero in GerarSequenciaAsync(5, cts.Token))
    {
        Console.WriteLine($"Número recebido: {numero}");
    }
}

Note que a anotação [EnumeratorCancellation] deixa claro para o compilador onde usamos o CancellationToken, aumentando a legibilidade.

Melhorias de ValueTask e Task

O ValueTask permite economizar alocações de objetos quando o resultado de uma operação assíncrona é quase imediato. Assim, no C# 13O que é C# 13 e por que aprender em 90 minutosO que é C# 13 e por que aprender em 90 minutosExplore as inovações do C# 13 e melhore a legibilidade do seu código. Este tutorial prático de 90 minutos oferece dicas essenciais para desenvolvedores .NET., transições entre Task e ValueTask ficaram mais inteligentes. Por exemplo, métodos que usam ValueTask podem ser chamados de maneira mais segura ao converter para Task, reduzindo a chance de overhead desnecessário.

public async ValueTask<int> CalcularSomaAsync(int x, int y)
{
    // Retorno imediato, sem criar Task adicional
    return x + y;
}
public async Task ExibirSomaAsync()
{
    // C# 13: aperfeiçoamento na conversão implícita de ValueTask para Task
    int resultado = await CalcularSomaAsync(10, 20);
    Console.WriteLine($"Resultado da soma: {resultado}");
}

Nova Convenção de Nomenclatura para Métodos Assíncronos (Opcional)

Com o objetivo de promover legibilidade, muitas equipes de desenvolvimento seguem um padrão de sufixar métodos assíncronos com "Async". No C# 13O que é C# 13 e por que aprender em 90 minutosO que é C# 13 e por que aprender em 90 minutosExplore as inovações do C# 13 e melhore a legibilidade do seu código. Este tutorial prático de 90 minutos oferece dicas essenciais para desenvolvedores .NET., diretrizes de estilo são mais claras quanto a isso, incentivando que métodos async utilizem nomes declarativos e mantenham Async ao final. Essa convenção não é obrigatória, mas é indicada pela comunidade e linting do compilador.

Exemplo Completo: Buscando e Processando Dados Assíncronamente🔗

A seguir, um exemplo que demonstra várias das melhorias mencionadas:

public class ProcessadorDeOrdens
{
    private readonly IApiDeOrdens _apiDeOrdens;
    public ProcessadorDeOrdens(IApiDeOrdens apiDeOrdens)
    {
        _apiDeOrdens = apiDeOrdens;
    }
    // Método assíncrono que retorna IAsyncEnumerable com cancelamento
    public async IAsyncEnumerable<Ordem> ObterOrdensAsync(
        [EnumeratorCancellation] CancellationToken ct = default)
    {
        var ordens = await _apiDeOrdens.ListarOrdensAsync(ct);
        foreach (var ordem in ordens)
        {
            // Simula processamento leve
            await Task.Delay(50, ct);
            yield return ordem;
        }
    }
    public async Task ProcessarAsync()
    {
        using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5));
        await foreach (var ordem in ObterOrdensAsync(cts.Token))
        {
            // Aqui o stack trace fica mais rico ao tratar exceções
            try
            {
                await ordem.FinalizarAsync(cts.Token);
                Console.WriteLine($"Ordem {ordem.Id} finalizada com sucesso.");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Falha ao processar ordem {ordem.Id}: {ex.Message}");
            }
        }
    }
}

Nesse cenário:

1. IAsyncEnumerable<Ordem> e o uso de [EnumeratorCancellation] deixam claros o fluxo assíncrono e o tratamento de cancelamento.

2. Em caso de exception, o C# 13O que é C# 13 e por que aprender em 90 minutosO que é C# 13 e por que aprender em 90 minutosExplore as inovações do C# 13 e melhore a legibilidade do seu código. Este tutorial prático de 90 minutos oferece dicas essenciais para desenvolvedores .NET. apresenta traces mais descritivos, facilitando a investigação de erros.

3. O uso de await dentro do foreach mantém o foco na legibilidade do fluxo.

Boas Práticas de Organização🔗

Para garantir uma migração suave e aproveitar as novidades do C# 13O que é C# 13 e por que aprender em 90 minutosO que é C# 13 e por que aprender em 90 minutosExplore as inovações do C# 13 e melhore a legibilidade do seu código. Este tutorial prático de 90 minutos oferece dicas essenciais para desenvolvedores .NET.:

1. Padronize a nomenclatura dos métodos async: sufixe com Async.

2. Use ValueTask para rotinas curtas e Task em cenários mais complexos ou que podem prolongar.

3. Centralize o tratamento de exceções em blocos try-catch adequados, mantendo a pilha de chamadas coerente.

4. Combine async streams com cancelamento para controle refinado do fluxo de dados.

5. Aproveite as ferramentas de análise do compilador do C# 13 para checagem de nulosRecursos avançados de null-checking no C# 13Recursos avançados de null-checking no C# 13Aprenda a dominar o null-checking em C# 13 com técnicas avançadas e exemplos práticos que garantem código seguro, legível e performático. e recomendações de estilo.

Conclusão🔗

O refinamento de async e await no C# 13O que é C# 13 e por que aprender em 90 minutosO que é C# 13 e por que aprender em 90 minutosExplore as inovações do C# 13 e melhore a legibilidade do seu código. Este tutorial prático de 90 minutos oferece dicas essenciais para desenvolvedores .NET. demonstra como a linguagem continua a evoluir para oferecer mais legibilidade e desempenho. Adotar essas novas funcionalidades e diretrizes garante um código mais limpo, confiável e fácil de manter. Explorando esses conceitos e aplicando as dicas compartilhadas, você estará pronto para enfrentar cenários assíncronos cada vez mais desafiadores em suas aplicações .NET.

Dica Final: não esqueça de habilitar as novas configurações de análise e estilo do compilador para async no seu arquivo de projeto ou nas preferências do IDE, garantindo que seu código esteja em total conformidade com as recomendações do C# 13.
Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.

Referências🔗

Compartilhar artigo

Artigos Relacionados