Sobes.tech
Middle

Care este diferența dintre fire (Thread) și sarcini (Task) în C#?

sobes.tech AI

Răspuns de la AI

Firele (Thread) reprezintă o abstracție de nivel scăzut a sistemului de operare pentru executarea codului în paralel. Task-urile (Task) sunt un concept de nivel superior în .NET, bazat pe un pool de fire, care simplifică programarea asincronă și paralelă.

Diferențele principale:

  • Nivel de abstracție: Thread lucrează direct cu firele OS. Task este o abstracție gestionată de planificator (de obicei ThreadPool).
  • Gestionare: Gestionarea manuală a firelor (creare, pornire, oprire) poate fi complicată. Task-urile sunt gestionate de planificator, ceea ce le face mai ușor de utilizat.
  • Resurse: Crearea unui nou Thread necesită mai multe resurse de sistem decât utilizarea unui Task din pool-ul de fire.
  • Valori de întoarcere și excepții: Task are mecanisme încorporate pentru obținerea valorilor de întoarcere (Task<TResult>) și gestionarea excepțiilor neprocesate. Pentru Thread, acest lucru necesită implementare manuală.
  • Asincronism: Task este strâns integrat cu cuvintele cheie async și await, ceea ce simplifică semnificativ scrierea codului asincron. Thread pentru asincronism necesită utilizarea manuală a callback-urilor sau a altor mecanisme.
  • Anulare: Anularea Task este suportată prin CancellationToken. Anularea Thread necesită implementare manuală a mecanismelor de întrerupere.

Exemplu de creare și așteptare:

// Utilizarea Task
async Task MyTaskAsync()
{
    await Task.Delay(100);
    Console.WriteLine("Task terminat");
}

// Pornirea și așteptarea Task
Task t = MyTaskAsync();
await t;

// Utilizarea Thread (abordare de nivel inferior)
Thread myThread = new Thread(() =>
{
    Thread.Sleep(100);
    Console.WriteLine("Thread terminat");
});

// Pornirea Thread-ului
myThread.Start();

// Așteptarea finalizării Thread-ului (apel blocant)
myThread.Join();