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
asyncaawait, 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();