C# Academy · Lektion

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.

Lektion 3 av 38 steg

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

Snabb kontroll: Vad anger ConfigureAwait(false) att await ska göra?

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.

Gratis att börja

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

  1. Task/ValueTask och den asynkrona tillståndsmaskinen (koncept)
  2. Asynkrona fallgropar: sync-over-async och deadlocks
  3. ConfigureAwait och undantagsflöde
← Tillbaka till C# Academy