Sobes.tech
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 async i await, 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();