Sobes.tech
Junior — Middle

Kako se implementira mehanizam čekanja na završetak zadataka unutar poola niti?

sobes.tech АИ

Одговор од АИ

U C#-u, mehanizam čekanja na završetak zadataka unutar pool-a niti obično se implementira pomoću klase Task i metoda za sinhronizaciju, kao što su Task.Wait(), Task.WaitAll() ili Task.WhenAll().

Kada se zadaci pokreću u pool-u niti putem Task.Run ili ThreadPool.QueueUserWorkItem, može se čekati njihov završetak pozivom:

Task[] tasks = new Task[3];
tasks[0] = Task.Run(() => { /* rad */ });
tasks[1] = Task.Run(() => { /* rad */ });
tasks[2] = Task.Run(() => { /* rad */ });

// Čekanje na završetak svih zadataka
Task.WaitAll(tasks);

Ako se koristi direktno ThreadPool, može se primeniti ManualResetEvent ili CountdownEvent za čekanje:

CountdownEvent countdown = new CountdownEvent(3);

for (int i = 0; i < 3; i++)
{
    ThreadPool.QueueUserWorkItem(_ => {
        // rad
        countdown.Signal(); // smanjenje brojača
    });
}

// Čekanje na završetak svih zadataka
countdown.Wait();

Na ovaj način, mehanizam čekanja se zasniva na sinhronizaciji niti i korišćenju specijalnih metoda i klasa za blokiranje trenutne niti do završetka svih pokrenutih zadataka.