Junior — Middle
Como é que o mecanismo de espera pela conclusão das tarefas dentro do pool de threads é implementado?
sobes.tech IA
Resposta da IA
Em C#, o mecanismo de espera pela conclusão de tarefas dentro de um pool de threads é geralmente implementado usando a classe Task e métodos de sincronização, como Task.Wait(), Task.WaitAll() ou Task.WhenAll().
Quando as tarefas são iniciadas em um pool de threads usando Task.Run ou ThreadPool.QueueUserWorkItem, é possível aguardar sua conclusão chamando:
Task[] tasks = new Task[3];
tasks[0] = Task.Run(() => { /* trabalho */ });
tasks[1] = Task.Run(() => { /* trabalho */ });
tasks[2] = Task.Run(() => { /* trabalho */ });
// Aguardar a conclusão de todas as tarefas
Task.WaitAll(tasks);
Se usar ThreadPool diretamente, pode-se aplicar ManualResetEvent ou CountdownEvent para aguardar:
CountdownEvent countdown = new CountdownEvent(3);
for (int i = 0; i < 3; i++)
{
ThreadPool.QueueUserWorkItem(_ => {
// trabalho
countdown.Signal(); // diminuir o contador
});
}
// Aguardar a conclusão de todas as tarefas
countdown.Wait();
Assim, o mecanismo de espera baseia-se na sincronização de threads e no uso de métodos e classes especiais para bloquear a thread atual até que todas as tarefas em execução tenham sido concluídas.