ConfigureAwait, fluxo de exceções
Entenda a captura de contexto e ConfigureAwait(false); trate exceções com await em vez de bloqueios; conheça AggregateException e as práticas recomendadas.
ConfigureAwait, fluxo de exceções é uma aula grátis de C# Academy no CoddyKit. Esta é a aula 3 de 3. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C# Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C# Academy inclui 3 aulas no total.
Contexto e exceções
Objetivos:
- Entender o que é a captura de contexto
- Saber quando usar ConfigureAwait(false)
- Entender como as exceções fluem com await
- Entender por que o bloqueio leva a AggregateException
Boa prática para bibliotecas
Os métodos de bibliotecas devem usar ConfigureAwait(false) para evitar retomar a execução em um contexto de UI/web que não controlam.
using System;
using System.Threading.Tasks;
public static class NetLib
{
// Library code should not assume a UI context. Use ConfigureAwait(false).
public static async Task<string> FetchAsync()
{
await Task.Delay(100).ConfigureAwait(false); // do not capture context
return "payload";
}
}
public class Program
{
public static void Main(string[] args)
{
// Console apps typically have no SynchronizationContext; this still runs fine.
string s = NetLib.FetchAsync().GetAwaiter().GetResult();
Console.WriteLine("Got: " + s);
}
}
Regras de contexto
Captura de contexto:
- Por padrão, await tenta retomar a execução no contexto capturado (UI/ASP.NET)
- ConfigureAwait(false) indica: não capture o contexto; retome a execução no pool de encadeamentos
- Ajuda a evitar impasses quando os chamadores bloqueiam o encadeamento do contexto
- O código de UI pode precisar do contexto para atualizar controles; o código de biblioteca normalmente não deve precisar dele
Await e exceções
Quando você usa await, a exceção flui como o tipo de exceção original; capture-a normalmente.
using System;
using System.Threading.Tasks;
public class Program
{
static async Task<string> BoomAsync()
{
await Task.Delay(50);
throw new InvalidOperationException("boom");
}
public static void Main(string[] args)
{
// With await (inside async), exceptions rethrow as the original type.
try
{
string r = BoomAsync().GetAwaiter().GetResult(); // emulate await in Main
Console.WriteLine(r);
}
catch (InvalidOperationException ex)
{
Console.WriteLine("Caught: " + ex.GetType().Name + " - " + ex.Message);
}
}
}
Bloqueio e erros
Bloquear com .Result ou .Wait() envolve os erros em AggregateException; prefira await para um fluxo de erros mais claro.
using System;
using System.Threading.Tasks;
public class Program
{
static async Task<int> FailsAsync()
{
await Task.Delay(30);
throw new ArgumentException("bad arg");
}
public static void Main(string[] args)
{
try
{
// Blocking with .Result wraps the exception into AggregateException
int x = FailsAsync().Result;
Console.WriteLine(x);
}
catch (AggregateException ae)
{
Exception inner = ae.InnerException;
Console.WriteLine("AggregateException -> " + (inner == null ? "null" : inner.GetType().Name));
}
}
}
Boas práticas
Diretrizes:
- Em bibliotecas: use ConfigureAwait(false)
- Na UI/web: use await no encadeamento chamador quando precisar do contexto
- Evite .Result/.Wait(); capture as exceções originais com await
- Registre e lance novamente com mensagens cientes do contexto, quando necessário
Comportamento de ConfigureAwait
Recapitulação
Recapitulação: use ConfigureAwait(false) em bibliotecas; deixe o código de UI/web decidir quando precisa do contexto. Prefira await para um fluxo claro de exceções; o bloqueio envolve erros e cria risco de impasses.
Perguntas Frequentes
A aula “ConfigureAwait, fluxo de exceções” é grátis?
Sim — o texto completo de “ConfigureAwait, fluxo de exceções” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C# Academy, atualize para CoddyKit PRO. O curso de C# Academy inclui 3 aulas no total.
O que vou aprender em “ConfigureAwait, fluxo de exceções”?
Entenda a captura de contexto e ConfigureAwait(false); trate exceções com await em vez de bloqueios; conheça AggregateException e as práticas recomendadas. Você pratica C# Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar C# Academy?
Nenhuma experiência prévia é necessária. C# Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 3.
Quanto tempo leva a aula “ConfigureAwait, fluxo de exceções”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de C# Academy?
Sim. Cada aula de C# Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Task/ValueTask e a máquina de estados assíncrona (conceitos)
- Armadilhas assíncronas: sync-over-async e deadlocks
- ConfigureAwait, fluxo de exceções