Middle
Jaka jest różnica między wątkami (Thread) a zadaniami (Task) w C#?
sobes.tech AI
Odpowiedź od AI
Wątki (Thread) stanowią niskopoziomową abstrakcję systemu operacyjnego do wykonywania kodu równolegle. Zadania (Task) to wyższy poziom koncepcji w .NET, oparty na puli wątków, który upraszcza programowanie asynchroniczne i równoległe.
Główne różnice:
- Poziom abstrakcji: Thread bezpośrednio pracuje z wątkami systemu operacyjnego. Task to abstrakcja zarządzana przez planistę (zwykle ThreadPool).
- Zarządzanie: Ręczne zarządzanie wątkami (tworzenie, uruchamianie, zatrzymywanie) może być skomplikowane. Task jest zarządzany przez planistę, co ułatwia ich użycie.
- Zasoby: Tworzenie nowego wątku wymaga więcej zasobów systemowych niż użycie Task z puli wątków.
- Wartości zwracane i wyjątki: Task ma wbudowane mechanizmy do pobierania wartości zwracanych (
Task<TResult>) i obsługi nieobsłużonych wyjątków. Dla Thread wymaga to ręcznej implementacji. - Asynchroniczność: Task jest ściśle zintegrowany z słowami kluczowymi
asynciawait, co znacznie upraszcza pisanie kodu asynchronicznego. Thread do asynchroniczności wymaga ręcznego użycia callbacków lub innych mechanizmów. - Anulowanie: Anulowanie Task obsługiwane jest przez
CancellationToken. Anulowanie Thread wymaga ręcznej implementacji mechanizmów przerwania.
Przykład tworzenia i oczekiwania:
// Użycie Task
async Task MyTaskAsync()
{
await Task.Delay(100);
Console.WriteLine("Zadanie zakończone");
}
// Uruchomienie i oczekiwanie na Task
Task t = MyTaskAsync();
await t;
// Użycie Thread (niższy poziom)
Thread myThread = new Thread(() =>
{
Thread.Sleep(100);
Console.WriteLine("Wątek zakończony");
});
// Uruchomienie Thread
myThread.Start();
// Oczekiwanie na zakończenie Thread (wywołanie blokujące)
myThread.Join();