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 retornarTask
(ouTask<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