ConfigureAwait och undantagsflöde
Förstå kontextfångst och ConfigureAwait(false); hantera undantag med await jämfört med blockering; se AggregateException och bästa praxis.
ConfigureAwait och undantagsflöde är en gratis lektion i C# Academy på CoddyKit. Detta är lektion 3 av 3. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för C# Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i C# Academy innehåller totalt 3 lektioner.
Kontext och undantag
Mål:
- Förstå vad kontextfångst innebär
- Veta när ConfigureAwait(false) ska användas
- Förstå hur undantag flödar med await
- Förstå varför blockering leder till AggregateException
Bästa praxis för bibliotek
Biblioteksmetoder bör använda ConfigureAwait(false) för att undvika att återuppta körningen i en UI- eller webbkontext som de inte äger.
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);
}
}
Regler för kontext
Kontextfångst:
- await försöker som standard återuppta körningen i den fångade kontexten (UI/ASP.NET)
- ConfigureAwait(false) anger att kontexten inte ska fångas; återuppta körningen i trådpoolen
- Hjälper till att undvika deadlock när anropare blockerar kontexttråden
- UI-kod kan behöva kontexten för att uppdatera kontroller; bibliotekskod bör vanligtvis inte behöva den
Await och undantag
När du använder await vidarebefordras undantaget som den ursprungliga undantagstypen; fånga det på vanligt sätt.
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);
}
}
}
Blockering och fel
Blockering med .Result eller .Wait() kapslar in fel i AggregateException; föredra await för ett tydligare felflöde.
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));
}
}
}
Bästa praxis
Riktlinjer:
- I bibliotek: använd ConfigureAwait(false)
- I UI- och webbappar: använd await på den anropande tråden när du behöver kontexten
- Undvik .Result/.Wait(); fånga ursprungliga undantag med await
- Logga och kasta om med kontextmedvetna meddelanden vid behov
Så fungerar ConfigureAwait
Sammanfattning
Sammanfattning: Använd ConfigureAwait(false) i bibliotek och låt UI- eller webbappar avgöra när de behöver kontexten. Föredra await för ett tydligt undantagsflöde; blockering kapslar in fel och medför risk för deadlock.
Lär dig C# med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 93
- Lektioner
- 346
Vanliga frågor
Är lektionen ”ConfigureAwait och undantagsflöde” gratis?
Ja – hela texten till ”ConfigureAwait och undantagsflöde” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i C# Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i C# Academy innehåller totalt 3 lektioner.
Vad lär jag mig i ”ConfigureAwait och undantagsflöde”?
Förstå kontextfångst och ConfigureAwait(false); hantera undantag med await jämfört med blockering; se AggregateException och bästa praxis. Ni övar på C# Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig C# Academy?
Du behöver inga förkunskaper. Utbildningen i C# Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 3 av 3.
Hur lång tid tar lektionen ”ConfigureAwait och undantagsflöde”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här C# Academy-lektionen?
Ja. Varje C# Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Task/ValueTask och den asynkrona tillståndsmaskinen (koncept)
- Asynkrona fallgropar: sync-over-async och deadlocks
- ConfigureAwait och undantagsflöde