Middle
Aký je rozdiel medzi vláknami (Thread) a úlohami (Task) v C#?
sobes.tech AI
Odpoveď od AI
Vlákna (Thread) predstavujú nízkoúrovňovú abstrakciu operačného systému pre paralelné vykonávanie kódu. Úlohy (Task) sú koncept vyššej úrovne v .NET, založený na vláknovom pooli, ktorý zjednodušuje asynchrónne a paralelné programovanie.
Hlavné rozdiely:
- Úroveň abstrakcie: Thread pracuje priamo s vláknami OS. Task je abstrakcia spravovaná plánovačom (zvyčajne ThreadPool).
- Správa: Ručné spravovanie vlákien (vytváranie, spustenie, zastavenie) môže byť zložité. Task je spravovaný plánovačom, čo uľahčuje ich použitie.
- Zdroje: Vytvorenie nového vlákna vyžaduje viac systémových zdrojov ako použitie Task z vláknového poolu.
- Vrátené hodnoty a výnimky: Task má vstavané mechanizmy na získanie vrátených hodnôt (
Task<TResult>) a spracovanie neobslúžených výnimiek. Pre vlákno je to potrebné implementovať manuálne. - Asynchrónnosť: Task je úzko integrovaný s kľúčovými slovami
asyncaawait, čo značne zjednodušuje písanie asynchrónneho kódu. Vlákno pre asynchrónnosť vyžaduje manuálne použitie callbackov alebo iných mechanizmov. - Zrušenie: Zrušenie Task je podporované cez
CancellationToken. Zrušenie vlákna vyžaduje manuálnu implementáciu mechanizmov prerušenia.
Príklad vytvorenia a čakania:
// Použitie Task
async Task MyTaskAsync()
{
await Task.Delay(100);
Console.WriteLine("Úloha dokončená");
}
// Spustenie a čakanie na Task
Task t = MyTaskAsync();
await t;
// Použitie vlákna (nižšia úroveň)
Thread myThread = new Thread(() =>
{
Thread.Sleep(100);
Console.WriteLine("Vlákno dokončené");
});
// Spustenie vlákna
myThread.Start();
// Čakanie na dokončenie vlákna (blokujúci volanie)
myThread.Join();