Junior — Middle
Comment le mécanisme d'attente de la fin des tâches dans le pool de threads est-il mis en œuvre?
sobes.tech IA
Réponse de l'IA
En C#, le mécanisme d'attente de la fin des tâches dans un pool de threads est généralement implémenté à l'aide de la classe Task et de méthodes de synchronisation telles que Task.Wait(), Task.WaitAll() ou Task.WhenAll().
Lorsque les tâches sont lancées dans un pool de threads via Task.Run ou ThreadPool.QueueUserWorkItem, on peut attendre leur fin en appelant :
Task[] tasks = new Task[3];
tasks[0] = Task.Run(() => { /* travail */ });
tasks[1] = Task.Run(() => { /* travail */ });
tasks[2] = Task.Run(() => { /* travail */ });
// Attendre la fin de toutes les tâches
Task.WaitAll(tasks);
Si l'on utilise directement ThreadPool, on peut appliquer ManualResetEvent ou CountdownEvent pour attendre :
CountdownEvent countdown = new CountdownEvent(3);
for (int i = 0; i < 3; i++)
{
ThreadPool.QueueUserWorkItem(_ => {
// travail
countdown.Signal(); // diminuer le compteur
});
}
// Attendre la fin de toutes les tâches
countdown.Wait();
Ainsi, le mécanisme d'attente repose sur la synchronisation des threads et l'utilisation de méthodes et classes spéciales pour bloquer le thread courant jusqu'à ce que toutes les tâches lancées soient terminées.