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