Sobes.tech
Middle

Jaký je rozdíl mezi vlákny (Thread) a úkoly (Task) v C#?

sobes.tech AI

Odpověď od AI

Vlákna (Thread) představují nízkoúrovňovou abstrakci operačního systému pro paralelní vykonávání kódu. Úkoly (Task) jsou koncept vyšší úrovně v .NET, založený na vláknovém poolu, který zjednodušuje asynchronní a paralelní programování.

Hlavní rozdíly:

  • Úroveň abstrakce: Thread přímo pracuje s vlákny OS. Task je abstrakce řízená plánovačem (obvykle ThreadPool).
  • Správa: Ruční správa vláken (vytváření, spuštění, zastavení) může být složitá. Task je spravován plánovačem, což usnadňuje jejich použití.
  • Zdroje: Vytvoření nového vlákna vyžaduje více systémových zdrojů než použití Task z vláknového poolu.
  • Návratové hodnoty a výjimky: Task má vestavěné mechanismy pro získání návratových hodnot (Task<TResult>) a zpracování nezpracovaných výjimek. U vlákna je to třeba implementovat ručně.
  • Asynchronní operace: Task je úzce integrován s klíčovými slovy async a await, což výrazně zjednodušuje psaní asynchronního kódu. U vlákna je třeba ručně používat callbacky nebo jiné mechanismy.
  • Zrušení: Zrušení Task je podporováno přes CancellationToken. Zrušení vlákna vyžaduje ruční implementaci mechanismů přerušení.

Příklad vytvoření a čekání:

// Použití Task
async Task MyTaskAsync()
{
    await Task.Delay(100);
    Console.WriteLine("Úkol dokončen");
}

// Spuštění a čekání na Task
Task t = MyTaskAsync();
await t;

// Použití vlákna (nižší úroveň)
Thread myThread = new Thread(() =>
{
    Thread.Sleep(100);
    Console.WriteLine("Vlákno dokončeno");
});

// Spuštění vlákna
myThread.Start();

// Čekání na dokončení vlákna (blokující volání)
myThread.Join();