Sobes.tech
Middle

Koja je razlika između niti (Thread) i zadataka (Task) u C#?

sobes.tech АИ

Одговор од АИ

Nit (Thread) predstavlja niskonivojsku apstrakciju operativnog sistema za izvršavanje koda paralelno. Zadaci (Task) su koncept višeg nivoa u .NET-u, zasnovan na poolu niti, koji pojednostavljuje asinhrono i paralelno programiranje.

Glavne razlike:

  • Nivo apstrakcije: Thread direktno radi sa OS nitima. Task je apstrakcija koju upravlja planer (obično ThreadPool).
  • Upravljanje: Ručno upravljanje nitima (kreiranje, pokretanje, zaustavljanje) može biti složeno. Task je upravljan od strane planera, što olakšava njihovu upotrebu.
  • Resursi: Kreiranje nove niti zahteva više sistemskih resursa nego korišćenje Task iz poola niti.
  • Vraćene vrednosti i izuzeci: Task ima ugrađene mehanizme za dobijanje vraćenih vrednosti (Task<TResult>) i obradu neobrađenih izuzetaka. Za Thread, ovo zahteva rušnu implementaciju.
  • Asinhronost: Task je usko integrisan sa ključnim rečima async i await, što znatno pojednostavljuje pisanje asinhronog koda. Thread za asinhronost zahteva ručno korišćenje callback-ova ili drugih mehanizama.
  • Otkaži: Otkaži Task podržava se putem CancellationToken. Otkaži Thread zahteva ručno implementiranje mehanizama prekida.

Primer kreiranja i čekanja:

// Korišćenje Task
async Task MyTaskAsync()
{
    await Task.Delay(100);
    Console.WriteLine("Zadatak je završio");
}

// Pokretanje i čekanje Task
Task t = MyTaskAsync();
await t;

// Korišćenje Thread-a (niži nivo)
Thread myThread = new Thread(() =>
{
    Thread.Sleep(100);
    Console.WriteLine("Thread je završio");
});

// Pokretanje Thread-a
myThread.Start();

// Čekanje na završetak Thread-a (blokirajući poziv)
myThread.Join();