Sobes.tech
Junior — Middle

Jak je implementován mechanismus čekání na dokončení úloh uvnitř vlákna?

sobes.tech AI

Odpověď od AI

V C# je mechanismus čekání na dokončení úloh uvnitř vláknové pooly obvykle implementován pomocí třídy Task a synchronizačních metod, jako jsou Task.Wait(), Task.WaitAll() nebo Task.WhenAll().

Když jsou úlohy spuštěny v rámci vláknové pooly pomocí Task.Run nebo ThreadPool.QueueUserWorkItem, lze na jejich dokončení čekat voláním:

Task[] tasks = new Task[3];
tasks[0] = Task.Run(() => { /* práce */ });
tasks[1] = Task.Run(() => { /* práce */ });
tasks[2] = Task.Run(() => { /* práce */ });

// Čekání na dokončení všech úloh
Task.WaitAll(tasks);

Pokud je přímo používán ThreadPool, lze použít ManualResetEvent nebo CountdownEvent pro čekání:

CountdownEvent countdown = new CountdownEvent(3);

for (int i = 0; i < 3; i++)
{
    ThreadPool.QueueUserWorkItem(_ => {
        // práce
        countdown.Signal(); // snížení čítače
    });
}

// Čekání na dokončení všech úloh
countdown.Wait();

Tímto způsobem je mechanismus čekání založen na synchronizaci vláken a použití speciálních metod a tříd k zablokování aktuálního vlákna do dokončení všech spuštěných úloh.