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