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.