0Pricing
C# Academy · Lektion

ConfigureAwait und Ausnahmefluss

Verstehen Sie die Kontextübernahme und ConfigureAwait(false). Behandeln Sie Ausnahmen mit await statt mit blockierenden Aufrufen und lernen Sie AggregateException sowie bewährte Vorgehensweisen kennen.

ConfigureAwait und Ausnahmefluss ist eine kostenlose C# Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 3. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C# Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C# Academy-Kurs umfasst insgesamt 3 Lektionen.

Kontext und Ausnahmen

Ziele:

  • Verstehen, was Kontexterfassung ist
  • Wissen, wann ConfigureAwait(false) verwendet wird
  • Verstehen, wie Ausnahmen mit await weitergereicht werden
  • Verstehen, warum Blockieren zu AggregateException führt

Bewährte Vorgehensweise für Bibliotheken

Bibliotheksmethoden sollten ConfigureAwait(false) verwenden, damit sie nicht in einem UI-/Webkontext fortgesetzt werden, den sie nicht kontrollieren.

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

Regeln für den Kontext

Kontexterfassung:

  • Ein normales await versucht standardmäßig, im erfassten Kontext (UI/ASP.NET) fortzufahren.
  • ConfigureAwait(false) bedeutet: nicht erfassen, sondern im Threadpool fortfahren.
  • Das hilft, Deadlocks zu vermeiden, wenn Aufrufer den Kontextthread blockieren.
  • UI-Code benötigt den Kontext möglicherweise zum Aktualisieren von Steuerelementen; Bibliothekscode sollte dies normalerweise nicht tun.

Await und Ausnahmen

Beim await wird die Ausnahme als ursprünglicher Ausnahmetyp weitergereicht; fangen Sie sie normal ab.

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

Blockieren und Fehler

Das Blockieren mit .Result oder .Wait() verpackt Fehler in AggregateException; bevorzugen Sie await für einen klareren Fehlerfluss.

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

Bewährte Vorgehensweisen

Richtlinien:

  • In Bibliotheken: Verwenden Sie ConfigureAwait(false).
  • In UI-/Webcode: Verwenden Sie await im aufrufenden Thread, wenn Sie den Kontext benötigen.
  • Vermeiden Sie .Result/.Wait(); fangen Sie ursprüngliche Ausnahmen mit await ab.
  • Protokollieren Sie bei Bedarf Ausnahmen und lösen Sie sie mit kontextbezogenen Meldungen erneut aus.

Verhalten von ConfigureAwait

Kurze Überprüfung: Was weist ConfigureAwait(false) ein await an zu tun?

Zusammenfassung

Zusammenfassung: Verwenden Sie ConfigureAwait(false) in Bibliotheken; überlassen Sie es UI-/Webcode zu entscheiden, wann der Kontext benötigt wird. Bevorzugen Sie await für einen klaren Fehlerfluss; Blockieren verpackt Fehler und birgt Deadlock-Gefahr.

Häufig gestellte Fragen

Ist die Lektion „ConfigureAwait und Ausnahmefluss“ kostenlos?

Ja — der vollständige Text von „ConfigureAwait und Ausnahmefluss“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C# Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C# Academy-Kurs umfasst insgesamt 3 Lektionen.

Was lerne ich in „ConfigureAwait und Ausnahmefluss“?

Verstehen Sie die Kontextübernahme und ConfigureAwait(false). Behandeln Sie Ausnahmen mit await statt mit blockierenden Aufrufen und lernen Sie AggregateException sowie bewährte Vorgehensweisen kenne… Du übst C# Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um C# Academy zu starten?

Keine Vorkenntnisse erforderlich. C# Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 3.

Wie lange dauert die Lektion „ConfigureAwait und Ausnahmefluss“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser C# Academy-Lektion Code schreiben und ausführen?

Ja. Jede C# Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Task/ValueTask und die asynchrone Zustandsmaschine (Konzepte)
  2. Async-Fallstricke: Sync-over-Async und Deadlocks
  3. ConfigureAwait und Ausnahmefluss
← Zurück zu C# Academy