Back to questions
Junior — Middle
62
Каким образом реализуется механизм ожидания завершения задач внутри пула потоков?
Answer from AI
sobes.tech AI
В C# механизм ожидания завершения задач внутри пула потоков обычно реализуется с помощью класса Task и методов синхронизации, таких как Task.Wait(), Task.WaitAll() или Task.WhenAll().
Когда задачи запускаются в пуле потоков через Task.Run или ThreadPool.QueueUserWorkItem, можно дождаться их завершения, вызвав:
Task[] tasks = new Task[3];
tasks[0] = Task.Run(() => { /* работа */ });
tasks[1] = Task.Run(() => { /* работа */ });
tasks[2] = Task.Run(() => { /* работа */ });
// Ожидание завершения всех задач
Task.WaitAll(tasks);
Если используется ThreadPool напрямую, можно применить ManualResetEvent или CountdownEvent для ожидания:
CountdownEvent countdown = new CountdownEvent(3);
for (int i = 0; i < 3; i++)
{
ThreadPool.QueueUserWorkItem(_ => {
// работа
countdown.Signal(); // уменьшаем счетчик
});
}
// Ожидание завершения всех задач
countdown.Wait();
Таким образом, механизм ожидания основан на синхронизации потоков и использовании специальных методов и классов для блокировки текущего потока до завершения всех запущенных задач.