Junior — Middle
Cum se implementează mecanismul de așteptare pentru finalizarea sarcinilor în interiorul pool-ului de fire de execuție?
sobes.tech AI
Răspuns de la AI
În C#, mecanismul de așteptare pentru finalizarea sarcinilor dintr-un pool de fire de execuție este de obicei implementat folosind clasa Task și metode de sincronizare, cum ar fi Task.Wait(), Task.WaitAll() sau Task.WhenAll().
Când sarcinile sunt inițiate în cadrul unui pool de fire de execuție prin Task.Run sau ThreadPool.QueueUserWorkItem, se poate aștepta finalizarea lor apelând:
Task[] tasks = new Task[3];
tasks[0] = Task.Run(() => { /* muncă */ });
tasks[1] = Task.Run(() => { /* muncă */ });
tasks[2] = Task.Run(() => { /* muncă */ });
// Așteaptă finalizarea tuturor sarcinilor
Task.WaitAll(tasks);
Dacă se utilizează direct ThreadPool, se pot aplica ManualResetEvent sau CountdownEvent pentru a aștepta:
CountdownEvent countdown = new CountdownEvent(3);
for (int i = 0; i < 3; i++)
{
ThreadPool.QueueUserWorkItem(_ => {
// muncă
countdown.Signal(); // reducerea contorului
});
}
// Așteaptă finalizarea tuturor sarcinilor
countdown.Wait();
Astfel, mecanismul de așteptare se bazează pe sincronizarea firelor și utilizarea metodelor și claselor speciale pentru blocarea firului curent până la finalizarea tuturor sarcinilor lansate.