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
asyncdevem retornarTask(ouTask<T>se retornarem um valor). - Evite usar
.Resultou.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
