Junior — Middle
Ako je implementovaný mechanizmus čakania na dokončenie úloh v rámci vlákna?
sobes.tech AI
Odpoveď od AI
V C#-u je mehanizam za čekanje na završetak zadataka unutar poola niti obično implementiran pomoću klase Task i metoda za sinhronizaciju, kao što su Task.Wait(), Task.WaitAll() ili Task.WhenAll().
Kada se zadaci pokreću u poolu niti putem Task.Run ili ThreadPool.QueueUserWorkItem, može se čekati njihov završetak pozivom:
Task[] tasks = new Task[3];
tasks[0] = Task.Run(() => { /* delo */ });
tasks[1] = Task.Run(() => { /* delo */ });
tasks[2] = Task.Run(() => { /* delo */ });
// Č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(_ => {
// delo
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.