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 operatoryawait. Metoda oznaczona jakoasyncmoże zwracaćTask,Task<T>lubvoid(chociażvoidnależy unikać, z wyjątkiem obsługi zdarzeń). ZwracanyTasklubTask<T>reprezentuje operację, która jeszcze się nie zakończyła.await: Stosuje się go do operacji asynchronicznej (zwracającejTasklubTask<T>). Gdy wykonanie osiąga operatorawait, 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 samymawaitna 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.