0Pricing
C# Academy · Lezione

ConfigureAwait, flusso delle eccezioni

Comprendete la cattura del contesto e ConfigureAwait(false); gestite le eccezioni con await rispetto al blocco; osservate AggregateException e le best practice.

ConfigureAwait, flusso delle eccezioni è una lezione C# Academy gratuita su CoddyKit. Questa è la lezione 3 di 3. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C# Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C# Academy include 3 lezioni in totale.

Contesto ed eccezioni

Obiettivi:

  • Capire che cos'è l'acquisizione del contesto
  • Capire quando usare ConfigureAwait(false)
  • Capire come si propagano le eccezioni con await
  • Capire perché il blocco porta a AggregateException

Buona pratica per le librerie

I metodi delle librerie dovrebbero usare ConfigureAwait(false) per evitare di riprendere l'esecuzione in un contesto UI/web che non gestiscono.

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);
  }
}

Regole del contesto

Acquisizione del contesto:

  • Per impostazione predefinita, await cerca di riprendere l'esecuzione nel contesto acquisito (UI/ASP.NET)
  • ConfigureAwait(false) indica di non acquisire il contesto e di riprendere l'esecuzione nel thread pool
  • Aiuta a evitare deadlock quando i chiamanti bloccano il thread del contesto
  • Il codice UI può aver bisogno del contesto per aggiornare i controlli; il codice delle librerie generalmente non dovrebbe averne bisogno

Await ed eccezioni

Quando usa await, l'eccezione viene propagata mantenendo il tipo di eccezione originale; la gestisca 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);
    }
  }
}

Blocco ed errori

Il blocco con .Result o .Wait() racchiude gli errori in AggregateException; preferisca await per ottenere una propagazione degli errori più chiara.

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));
    }
  }
}

Procedure consigliate

Linee guida:

  • Nelle librerie: usi ConfigureAwait(false)
  • In UI/web: usi await sul thread chiamante quando ha bisogno del contesto
  • Eviti .Result/.Wait(); con await intercetti le eccezioni originali
  • Se necessario, registri l'errore e lo rilanci con messaggi che tengano conto del contesto

Comportamento di ConfigureAwait

Verifica rapida: che cosa indica ConfigureAwait(false) a un'operazione await?

Riepilogo

Riepilogo: usi ConfigureAwait(false) nelle librerie; lasci che sia il codice UI/web a decidere quando ha bisogno del contesto. Preferisca await per una propagazione chiara delle eccezioni; il blocco racchiude gli errori e comporta il rischio di deadlock.

Domande Frequenti

La lezione «ConfigureAwait, flusso delle eccezioni» è gratuita?

Sì — il testo completo di «ConfigureAwait, flusso delle eccezioni» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C# Academy, passa a CoddyKit PRO. Il corso C# Academy include 3 lezioni in totale.

Cosa imparerò in «ConfigureAwait, flusso delle eccezioni»?

Comprendete la cattura del contesto e ConfigureAwait(false); gestite le eccezioni con await rispetto al blocco; osservate AggregateException e le best practice. Eserciti C# Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare C# Academy?

Non è richiesta alcuna esperienza precedente. C# Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 3.

Quanto tempo richiede la lezione «ConfigureAwait, flusso delle eccezioni»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione C# Academy?

Sì. Ogni lezione C# Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Task/ValueTask e macchina a stati async (concetti)
  2. Problemi comuni dell’asincronia: sync-over-async e deadlock
  3. ConfigureAwait, flusso delle eccezioni
← Torna a C# Academy