Task, Task<T> e async/await
ResumoProgramação assíncrona libera a thread enquanto uma operação de I/O (banco, rede, disco) acontece.
Taskrepresenta esse trabalho em andamento;async/awaitdeixam o código assíncrono parecer sequencial.
1. Objetivos de Aprendizagem#
- Entender
TaskeTask<T>. - Escrever métodos
asynce aguardar comawait. - Saber quando usar assíncrono (I/O) e quando não.
2. Pré-requisitos#
- Métodos e LINQ (Módulos 03 e 08).
3. Conceito#
Task: representa uma operação assíncrona sem valor de retorno;Task<T>representa uma que retornaT.async: marca um método que contémawait.await: suspende o método até aTaskconcluir — sem bloquear a thread. Ela é liberada para atender outras requisições e o método retoma quando o trabalho termina.
O porquê: em uma Web API, threads são um recurso finito. Bloquear uma thread esperando o banco responder derruba a escalabilidade. Async permite atender muito mais requisições com as mesmas threads.
4. Mão na Massa#
4.1. Setup#
dotnet new console -n Catalog.Async
cd Catalog.Async
4.2. Implementação Passo a Passo#
- Método assíncrono que retorna valor:
async Task<string> BuscarNomeAsync()
{
await Task.Delay(500); // simula I/O (banco, HTTP)
return "Produto do banco";
}
- Aguardando:
string nome = await BuscarNomeAsync();
Console.WriteLine(nome);
- Paralelismo de I/O com
Task.WhenAll:
var t1 = BuscarNomeAsync();
var t2 = BuscarNomeAsync();
string[] resultados = await Task.WhenAll(t1, t2); // aguarda as duas juntas
Dica
Mainpode serasync Taskno .NET moderno, permitindoawaitno nível superior.
4.3. Executando#
dotnet run
5. Exemplo Completo#
Disparar duas buscas e aguardá-las com Task.WhenAll executa o I/O concorrentemente — mais rápido do que await sequencial, quando as operações são independentes.
6. Boas Práticas e Armadilhas#
| Faça | Evite |
|---|---|
| Usar async para I/O (banco, HTTP, arquivo) | Async para trabalho puramente de CPU sem necessidade |
Propagar async/await por toda a cadeia | Bloquear com .Result/.Wait() (risco de deadlock) |
Sufixo Async nos nomes de métodos assíncronos | Misturar código sync e async sem critério |
Atenção
awaitnão cria threads — ele coordena a continuação. Assíncrono é sobre não bloquear enquanto se espera I/O, não sobre "rodar em paralelo" trabalho de CPU.
7. Segurança e Produção#
- APIs assíncronas de ponta a ponta escalam muito melhor sob carga. Praticamente todo método de acesso a dados no EF Core tem versão
...Async.
8. Exercícios#
- Fácil: crie um método
async Task<int>que retorna um número apósTask.Delay. - Médio: aguarde três tasks independentes com
Task.WhenAll. - Desafio: meça a diferença de tempo entre awaits sequenciais e
WhenAll.
9. Resumo#
Task/Task<T> representam trabalho assíncrono; async/await o escrevem de forma sequencial sem bloquear a thread. Use para I/O e propague async por toda a cadeia.
10. Próximos Passos#
A seguir, cancelar operações com CancellationToken.
11. Referências#
- Microsoft Learn — Programação assíncrona com async e await
- Microsoft Learn — Task-based Asynchronous Pattern (TAP)
- Microsoft Learn — Task.WhenAll