Sobes.tech
Junior

Czym jest programowanie asynchroniczne z użyciem słów kluczowych async i await?

sobes.tech AI

Odpowiedź od AI

Programowanie asynchroniczne z async i await pozwala na wykonywanie operacji, które mogą zająć dużo czasu (np. wejście/wyjście, żądania sieciowe), nie blokując głównego wątku wykonywania programu. To poprawia responsywność aplikacji.

  • async: Używa się go do modyfikacji metody i wskazuje kompilatorowi, że w jej wnętrzu będą używane operatory await. Metoda oznaczona jako async może zwracać Task, Task<T> lub void (chociaż void należy unikać, z wyjątkiem obsługi zdarzeń). Zwracany Task lub Task<T> reprezentuje operację, która jeszcze się nie zakończyła.
  • await: Stosuje się go do operacji asynchronicznej (zwracającej Task lub Task<T>). Gdy wykonanie osiąga operator await, metoda "wstrzymuje się", zwalniając bieżący wątek. Operacja asynchroniczna jest wykonywana w tle (lub korzysta z puli wątków, lub mechanizmu wejścia/wyjścia systemu operacyjnego). Gdy operacja się kończy, wykonanie metody jest wznawiane po tym samym await na innym lub tym samym wątku, jeśli jest dostępny.

Przykład podstawowego użycia:

// metoda async zwracająca Task
public async Task DoSomethingAsync()
{
    // Wykonuje operację asynchroniczną oczekując na jej zakończenie
    await Task.Delay(1000); // Symulacja długiej operacji
    Console.WriteLine("Operacja asynchroniczna zakończona.");
}

// metoda async zwracająca Task<int>
public async Task<int> GetValueAsync()
{
    await Task.Delay(500);
    return 42;
}

// Użycie async i await w metodzie Main (w praktyce zwykle uruchamia się ją z async Main w .NET Core 3.0+)
public static async Task Main(string[] args)
{
    Console.WriteLine("Rozpoczynam...");
    
    // Wywołanie metod asynchronicznych
    await DoSomethingAsync();
    int result = await GetValueAsync();
    
    Console.WriteLine($"Wynik: {result}");
    Console.WriteLine("Zakończono.");
}

Główna zaleta async/await w porównaniu do ręcznego zarządzania wątkami lub callbackami to uproszczenie pisania i czytania kodu asynchronicznego. Wygląda prawie jak kod synchroniczny, ale nie blokuje wątku, co jest kluczowe dla aplikacji z interfejsem użytkownika lub serwerowych o dużym obciążeniu.