Sobes.tech
Middle

Kāda ir atšķirība starp pavedieniem (Thread) un uzdevumiem (Task) C#?

sobes.tech AI

Atbilde no AI

Straumes (Thread) ir Task ir .NET augstākā līmeņa koncepcijas, kas ļauj veikt kodu paralēli. Galvenās atšķirības:

  • Abstrakcijas līmenis: Thread tieši darbojas ar OS pavedieniem. Task ir abstrakcija, ko pārvalda plānotājs (parasti ThreadPool).
  • Vadība: Pavedienu manuāla pārvaldība (izveide, palaišana, apturēšana) var būt sarežģīta. Task tiek pārvaldīts ar plānotāju, kas to padara vienkāršāku.
  • Resursi: Jauna pavediena izveide prasa vairāk sistēmas resursu nekā izmantojot Task no pavedienu baseina.
  • Atgrieztās vērtības un izņēmumi: Task ir iebūvēti mehānismi, lai saņemtu atgrieztās vērtības (Task<TResult>) un apstrādātu neapstrādātas izņēmumus. Pavedienam tas prasa manuālu īstenošanu.
  • Asinhronitāte: Task ir cieši integrēts ar async un await atslēgvārdiem, kas ievērojami atvieglo asinhrona koda rakstīšanu. Pavedienam asinhronitātei ir jāizmanto atpakaļsaišu funkcijas vai citi mehānismi.
  • Atcelšana: Task atcelšana tiek atbalstīta ar CancellationToken. Pavedienam atcelšana prasa manuālu pārtraukšanas mehānismu īstenošanu.

Piemērs, kā izveidot un gaidīt:

// Izmantojot Task
async Task MyTaskAsync()
{
    await Task.Delay(100);
    Console.WriteLine("Uzdevums pabeigts");
}

// Sākt un gaidīt Task
Task t = MyTaskAsync();
await t;

// Izmantojot Thread (zemāka līmeņa pieeja)
Thread myThread = new Thread(() =>
{
    Thread.Sleep(100);
    Console.WriteLine("Diena pabeigta");
});

// Sākt Thread
myThread.Start();

// Gaidīt, kamēr Thread pabeigs (bloķējošs izsaukums)
myThread.Join();