Sobes.tech
Junior — Middle

Hoe wordt het wachtmechanisme voor het voltooien van taken binnen de threadpool geïmplementeerd?

sobes.tech AI

Antwoord van AI

In C# wordt het mechanisme om te wachten op de voltooiing van taken binnen een threadpool meestal geïmplementeerd met behulp van de Task-klasse en synchronisatiemethoden zoals Task.Wait(), Task.WaitAll() of Task.WhenAll().

Wanneer taken worden gestart in een threadpool via Task.Run of ThreadPool.QueueUserWorkItem, kunnen ze worden afgewacht door te bellen:

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

// Wachten tot alle taken voltooid zijn
Task.WaitAll(tasks);

Als ThreadPool rechtstreeks wordt gebruikt, kan ManualResetEvent of CountdownEvent worden toegepast om te wachten:

CountdownEvent countdown = new CountdownEvent(3);

for (int i = 0; i < 3; i++)
{
    ThreadPool.QueueUserWorkItem(_ => {
        // werk
        countdown.Signal(); // teller verlagen
    });
}

// Wachten tot alle taken voltooid zijn
countdown.Wait();

Op deze manier is het wachtmechanisme gebaseerd op thread-synchronisatie en het gebruik van speciale methoden en klassen om de huidige thread te blokkeren totdat alle gestartte taken zijn voltooid.