0Pricing
C# Academy · Lekcja

ConfigureAwait i przepływ wyjątków

Proszę zrozumieć przechwytywanie kontekstu i ConfigureAwait(false), obsługiwać wyjątki za pomocą await zamiast blokowania oraz poznać AggregateException i dobre praktyki.

ConfigureAwait i przepływ wyjątków to bezpłatna lekcja C# Academy na CoddyKit. To lekcja 3 z 3. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C# Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C# Academy zawiera 3 lekcji w sumie.

Kontekst i wyjątki

Cele:

  • Zrozumienie, czym jest przechwytywanie kontekstu
  • Wiedza, kiedy używać ConfigureAwait(false)
  • Zrozumienie przepływu wyjątków przy użyciu await
  • Zrozumienie, dlaczego blokowanie prowadzi do AggregateException

Najlepsza praktyka w bibliotekach

Metody bibliotek powinny używać ConfigureAwait(false), aby uniknąć wznawiania działania w kontekście UI lub sieci, którego biblioteka nie kontroluje.

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

Zasady dotyczące kontekstu

Przechwytywanie kontekstu:

  • Domyślne await próbuje wznowić wykonanie w przechwyconym kontekście (UI/ASP.NET)
  • ConfigureAwait(false) oznacza: nie przechwytuj kontekstu; wznów wykonanie w puli wątków
  • Pomaga uniknąć zakleszczeń, gdy wywołujący blokują wątek kontekstu
  • Kod UI może potrzebować kontekstu do aktualizowania kontrolek; kod bibliotek zwykle go nie potrzebuje

Await i wyjątki

Podczas używania await wyjątek zachowuje swój oryginalny typ; należy przechwytywać go w zwykły sposób.

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

Blokowanie i błędy

Blokowanie za pomocą .Result lub .Wait() opakowuje błędy w AggregateException; dla czytelniejszego przepływu błędów należy preferować await.

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

Najlepsze praktyki

Wytyczne:

  • W bibliotekach należy używać ConfigureAwait(false)
  • W aplikacjach UI lub internetowych należy wykonywać await w wątku wywołującym, gdy potrzebny jest kontekst
  • Należy unikać .Result/.Wait(); przy użyciu await należy przechwytywać oryginalne wyjątki
  • W razie potrzeby należy rejestrować wyjątki i ponownie je zgłaszać za pomocą komunikatów uwzględniających kontekst

Działanie ConfigureAwait

Szybkie sprawdzenie: Co ConfigureAwait(false) nakazuje await?

Podsumowanie

Podsumowanie: W bibliotekach należy używać ConfigureAwait(false); kod UI lub internetowy powinien sam decydować, kiedy potrzebuje kontekstu. Dla czytelnego przepływu wyjątków należy preferować await; blokowanie opakowuje błędy i grozi zakleszczeniami.

Często zadawane pytania

Czy lekcja „ConfigureAwait i przepływ wyjątków” jest bezpłatna?

Tak — pełny tekst „ConfigureAwait i przepływ wyjątków” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C# Academy, przejdź na CoddyKit PRO. Kurs C# Academy zawiera 3 lekcji w sumie.

Co nauczysz się w „ConfigureAwait i przepływ wyjątków”?

Proszę zrozumieć przechwytywanie kontekstu i ConfigureAwait(false), obsługiwać wyjątki za pomocą await zamiast blokowania oraz poznać AggregateException i dobre praktyki. Ćwiczysz C# Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć C# Academy?

Nie wymagamy żadnego doświadczenia. C# Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 3.

Ile czasu zajmuje lekcja „ConfigureAwait i przepływ wyjątków”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji C# Academy?

Tak. Każda lekcja C# Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Task/ValueTask i maszyna stanów async (koncepcje)
  2. Pułapki async: sync-over-async i zakleszczenia
  3. ConfigureAwait i przepływ wyjątków
← Powrót do C# Academy