Async i await
Async i Await są mechanizmami wprowadzonymi w języku C# od wersji 5.0, które pozwalają na asynchroniczne programowanie w sposób bardziej czytelny i wydajny. Pozwalają one na efektywne zarządzanie asynchronicznymi operacjami w kodzie, takimi jak wywołania sieciowe, odczyt plików, operacje bazodanowe itp., bez blokowania wątku i bezczynnego oczekiwania na wynik. Dzięki temu aplikacje są bardziej responsywne i mogą lepiej obsługiwać duże obciążenia.
Ważne pojęcia:
-
Asynchroniczność: Oznacza, że zadania nie muszą być wykonywane sekwencyjnie i synchronicznie. Możemy wykonywać wiele operacji równocześnie, co jest szczególnie przydatne w przypadku zadań I/O-zależnych, które wymagają czasu na oczekiwanie na odpowiedź (np. pobieranie danych z Internetu).
-
Task (Zadanie): Task to obiekt reprezentujący asynchroniczne zadanie. Może ono zwracać wynik lub być typu "void". Task reprezentuje zlecone zadanie, które będzie wykonywane w tle.
-
async: Jest to modyfikator, który oznacza, że metoda zawiera kod asynchroniczny. Metoda z modyfikatorem async musi zwracać typ Task lub Task
(jeśli ma zwracać wynik). -
await: Operator await używany jest wewnątrz metody async i wskazuje na punkt, w którym metoda czeka na zakończenie asynchronicznej operacji. Wywołanie z operatorem await pozwala na asynchroniczne czekanie na zakończenie Task-a, bez blokowania wątku.
Przykład - Asynchroniczne pobieranie danych z Internetu:
using System;
using System.Net.Http;
using System.Threading.Tasks;
public class Program
{
public static async Task Main(string[] args)
{
await DownloadDataAsync();
Console.WriteLine("Pobieranie zakończone!");
}
public static async Task DownloadDataAsync()
{
using (var client = new HttpClient())
{
string url = "https://example.com/data";
string result = await client.GetStringAsync(url);
Console.WriteLine("Pobrane dane: " + result);
}
}
}
W powyższym przykładzie, metoda DownloadDataAsync jest oznaczona jako async, co pozwala na użycie operatora await. Wewnątrz tej metody, używając obiektu HttpClient, pobieramy dane z adresu URL asynchronicznie za pomocą metody GetStringAsync(). Gdy kod napotka operator await, nie blokuje on głównego wątku; zamiast tego wstrzymuje wykonanie metody DownloadDataAsync, aż operacja pobierania danych zostanie zakończona. W międzyczasie główny wątek może obsługiwać inne zadania.
Przykłady zastosowań async/await:
-
Aplikacje sieciowe: Gdy aplikacja potrzebuje pobierać dane z serwera lub komunikować się z API, async/await pozwala na wykonywanie tych operacji asynchronicznie, co poprawia responsywność aplikacji i pozwala na jednoczesne przetwarzanie innych zadań.
-
Aplikacje desktopowe: W aplikacjach desktopowych, np. Windows Forms lub WPF, async/await mogą być wykorzystane do asynchronicznego przetwarzania operacji I/O, takich jak odczyt plików lub operacje na bazach danych, bez zamrażania interfejsu użytkownika.
-
Aplikacje mobilne: W aplikacjach na platformy mobilne, async/await pozwalają na wykonywanie operacji sieciowych lub zapisu do bazy danych asynchronicznie, co zapewnia płynne działanie aplikacji i zapobiega zamrożeniu interfejsu użytkownika.
-
Serwisy internetowe: Serwisy internetowe często muszą obsługiwać wiele żądań równocześnie. Mechanizm async/await pozwala na efektywne zarządzanie wieloma żądaniami bez konieczności tworzenia wielu wątków.
Podsumowując, async/await w C# są niezwykle przydatnymi mechanizmami, które umożliwiają programowanie asynchroniczne w sposób bardziej wydajny i czytelny. Pozwalają na skuteczne zarządzanie operacjami I/O-zależnymi, zapewniając responsywność aplikacji i lepszą wydajność.