Sobes.tech
Middle

Kuo skiriasi gijos (Thread) ir užduotys (Task) C#?

sobes.tech AI

Atsakymas iš AI

Srautiniai (Thread) yra žemo lygio operacinės sistemos abstrakcija, skirta vykdyti kodą lygiagrečiai. Užduotys (Task) yra aukštesnio lygio koncepcija .NET, pagrįsta srautų baseinu, palengvinanti asinchroninį ir lygiagretų programavimą.

Pagrindiniai skirtumai:

  • Abstrakcijos lygis: Thread tiesiogiai dirba su OS srautais. Task yra abstrakcija, valdoma planuotojo (dažniausiai ThreadPool).
  • Valdymas: Srautų valdymas rankiniu būdu (sukūrimas, paleidimas, sustabdymas) gali būti sudėtingas. Task valdomas planuotojo, kas palengvina jų naudojimą.
  • Ištekliai: Naujo Thread sukūrimas reikalauja daugiau sisteminių išteklių nei naudojant Task iš srautų baseino.
  • Grąžinamos reikšmės ir išimtys: Task turi įmontuotus mechanizmus grąžinamoms reikšmėms gauti (Task<TResult>) ir neapdorotų išimčių apdorojimui. Thread tai reikalauja rankinio įgyvendinimo.
  • Asinchroniškumas: Task glaudžiai integruotas su raktažodžiais async ir await, kas žymiai palengvina asinchroninio kodo rašymą. Thread asinchroniškumui reikalauja rankinio naudoti atgalinius kvietimus ar kitus mechanizmus.
  • Atšaukimas: Task atšaukimas palaikomas per CancellationToken. Thread atšaukimas reikalauja rankinio pertraukimo mechanizmų įgyvendinimo.

Pavyzdys, kaip kurti ir laukti:

// Naudojant Task
async Task MyTaskAsync()
{
    await Task.Delay(100);
    Console.WriteLine("Užduotis baigta");
}

// Paleisti ir laukti Task
Task t = MyTaskAsync();
await t;

// Naudojant Thread (žemesnio lygio požiūris)
Thread myThread = new Thread(() =>
{
    Thread.Sleep(100);
    Console.WriteLine("Gija baigta");
});

// Paleisti Thread
myThread.Start();

// Laukti, kol Thread baigsis (blokavimo iškvietimas)
myThread.Join();