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șiawait, 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();