Junior — Middle
Jak jest realizowany mechanizm oczekiwania na zakończenie zadań w puli wątków?
sobes.tech AI
Odpowiedź od AI
W C# mechanizm oczekiwania na zakończenie zadań w ramach puli wątków jest zazwyczaj realizowany za pomocą klasy Task i metod synchronizacji, takich jak Task.Wait(), Task.WaitAll() lub Task.WhenAll().
Gdy zadania są uruchamiane w puli wątków za pomocą Task.Run lub ThreadPool.QueueUserWorkItem, można na nie czekać, wywołując:
Task[] tasks = new Task[3];
tasks[0] = Task.Run(() => { /* praca */ });
tasks[1] = Task.Run(() => { /* praca */ });
tasks[2] = Task.Run(() => { /* praca */ });
// Czekanie na zakończenie wszystkich zadań
Task.WaitAll(tasks);
Jeśli korzysta się bezpośrednio z ThreadPool, można zastosować ManualResetEvent lub CountdownEvent do oczekiwania:
CountdownEvent countdown = new CountdownEvent(3);
for (int i = 0; i < 3; i++)
{
ThreadPool.QueueUserWorkItem(_ => {
// praca
countdown.Signal(); // zmniejsz licznik
});
}
// Czekanie na zakończenie wszystkich zadań
countdown.Wait();
W ten sposób mechanizm oczekiwania opiera się na synchronizacji wątków i użyciu specjalnych metod i klas do zablokowania bieżącego wątku do czasu zakończenia wszystkich uruchomionych zadań.