Pular para o conteúdo
.NETTask, Task<T> e async/await
Módulo 02Fundamentos de Aplicação

Task, Task<T> e async/await

intermediario 30 min de leitura·Atualizado · .NET 9
Resumo

Programação assíncrona libera a thread enquanto uma operação de I/O (banco, rede, disco) acontece. Task representa esse trabalho em andamento; async/await deixam o código assíncrono parecer sequencial.

1. Objetivos de Aprendizagem#

  • Entender Task e Task<T>.
  • Escrever métodos async e aguardar com await.
  • 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 retorna T.
  • async: marca um método que contém await.
  • await: suspende o método até a Task concluir — 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.

Carregando diagrama…

4. Mão na Massa#

4.1. Setup#

Shell
dotnet new console -n Catalog.Async
cd Catalog.Async

4.2. Implementação Passo a Passo#

  1. Método assíncrono que retorna valor:
C#
async Task<string> BuscarNomeAsync()
{
    await Task.Delay(500);        // simula I/O (banco, HTTP)
    return "Produto do banco";
}
  1. Aguardando:
C#
string nome = await BuscarNomeAsync();
Console.WriteLine(nome);
  1. Paralelismo de I/O com Task.WhenAll:
C#
var t1 = BuscarNomeAsync();
var t2 = BuscarNomeAsync();
string[] resultados = await Task.WhenAll(t1, t2); // aguarda as duas juntas
Dica

Main pode ser async Task no .NET moderno, permitindo await no nível superior.

4.3. Executando#

Shell
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çaEvite
Usar async para I/O (banco, HTTP, arquivo)Async para trabalho puramente de CPU sem necessidade
Propagar async/await por toda a cadeiaBloquear com .Result/.Wait() (risco de deadlock)
Sufixo Async nos nomes de métodos assíncronosMisturar código sync e async sem critério
Atenção

await nã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ós Task.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#

11-01 — Task, Task<T> e async/await | Curso ASP.NET Core