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
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
- Task/ValueTask e macchina a stati async (concetti)
- Problemi comuni dell’asincronia: sync-over-async e deadlock
- ConfigureAwait, flusso delle eccezioni