Sobes.tech
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.