0Pricing
C# Academy · Aula

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

Verificação rápida: o que ConfigureAwait(false) instrui uma operação await a fazer?

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

  1. Task/ValueTask e a máquina de estados assíncrona (conceitos)
  2. Armadilhas assíncronas: sync-over-async e deadlocks
  3. ConfigureAwait, fluxo de exceções
← Voltar para C# Academy