Programação Assíncrona em C#

A programação assíncrona é uma das ferramentas mais poderosas da linguagem C#. Ela permite que você escreva código que realiza várias tarefas ao mesmo tempo, sem bloquear a execução do programa. Neste artigo, vamos explorar a programação assíncrona com async e await de forma simples, com exemplos claros e práticos.

Por que usar programação assíncrona?

Imagine que você está desenvolvendo um aplicativo que precisa acessar a internet para buscar dados de uma API. Essa operação pode levar alguns segundos para ser concluída. Se você usar um código síncrono, o aplicativo ficará “travado” enquanto espera a resposta, o que é uma péssima experiência para o usuário.

Com a programação assíncrona, o programa continua executando outras tarefas enquanto espera pela resposta da API, melhorando o desempenho e a fluidez da aplicação.

Conceitos básicos: async e await

O que é async?

A palavra-chave async é usada para indicar que um método contém operações assíncronas. Esse método pode usar a palavra-chave await para “esperar” uma tarefa ser concluída sem bloquear o thread principal.

O que é await?

await é usado dentro de métodos async para aguardar a conclusão de uma tarefa (como uma chamada à API ou leitura de arquivo), permitindo que o restante do programa continue rodando.

Estrutura de um método assíncrono

public async Task MeuMetodoAssincrono()
{
    await Task.Delay(1000); // simula uma espera de 1 segundo
    Console.WriteLine("Tarefa concluída!");
}

Exemplo prático: buscando dados de uma API

Vamos criar um exemplo onde buscamos dados de uma API pública de forma assíncrona.

Passo 1: Criar o método assíncrono

using System;
using System.Net.Http;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        await BuscarDadosDaApi();
    }

    static async Task BuscarDadosDaApi()
    {
        HttpClient client = new HttpClient();

        Console.WriteLine("Buscando dados...");

        HttpResponseMessage response = await client.GetAsync("https://jsonplaceholder.typicode.com/posts/1");
        string resultado = await response.Content.ReadAsStringAsync();

        Console.WriteLine("Dados recebidos:");
        Console.WriteLine(resultado);
    }
}

Explicação:

  • HttpClient é usado para fazer requisições HTTP.
  • await client.GetAsync(...) envia a requisição de forma assíncrona.
  • Enquanto espera a resposta, o programa não trava e pode continuar executando outras tarefas.

Exemplo com múltiplas tarefas simultâneas

Vamos simular a execução de várias tarefas ao mesmo tempo.

static async Task Main(string[] args)
{
    Task tarefa1 = TarefaDemorada("Tarefa 1", 3000);
    Task tarefa2 = TarefaDemorada("Tarefa 2", 2000);
    Task tarefa3 = TarefaDemorada("Tarefa 3", 1000);

    await Task.WhenAll(tarefa1, tarefa2, tarefa3);

    Console.WriteLine("Todas as tarefas foram concluídas.");
}

static async Task TarefaDemorada(string nome, int tempo)
{
    Console.WriteLine($"Iniciando {nome}");
    await Task.Delay(tempo);
    Console.WriteLine($"{nome} concluída após {tempo}ms");
}

O que acontece aqui?

  • As três tarefas são iniciadas quase ao mesmo tempo.
  • Cada uma tem um tempo diferente de espera (1s, 2s e 3s).
  • Task.WhenAll(...) espera que todas sejam concluídas antes de seguir.

Resultado esperado no console:

Iniciando Tarefa 1
Iniciando Tarefa 2
Iniciando Tarefa 3
Tarefa 3 concluída após 1000ms
Tarefa 2 concluída após 2000ms
Tarefa 1 concluída após 3000ms
Todas as tarefas foram concluídas.
Dicas importantes
  • Métodos async devem retornar Task (ou Task<T> se retornarem um valor).
  • Evite usar .Result ou .Wait(), pois eles bloqueiam a execução e anulam os benefícios da programação assíncrona.
  • Use ConfigureAwait(false) se você não precisa voltar para o contexto original (por exemplo, em bibliotecas).
Quando NÃO usar programação assíncrona

Embora muito útil, a programação assíncrona nem sempre é necessária:

  • Evite usar em operações extremamente rápidas (como cálculos simples).
  • Não use se toda a lógica já for síncrona e não houver chamadas a I/O (leitura de disco, rede, etc.).

Views: 2

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Rolar para cima