Sobes.tech
Junior — Middle

Kaip įgyvendinamas laukimo mechanizmas, skirtas užduočių pabaigai siūlų baseine?

sobes.tech AI

Atsakymas iš AI

C# kalboje užduočių pabaigos laukimo mechanizmas dažniausiai įgyvendinamas naudojant Task klasę ir sinchronizacijos metodus, tokius kaip Task.Wait(), Task.WaitAll() arba Task.WhenAll().

Kai užduotys pradedamos naudojant Task.Run arba ThreadPool.QueueUserWorkItem šaipų kalboje, jų pabaigą galima laukti iškviečiant:

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

// Laukti, kol baigsis visos užduotys
Task.WaitAll(tasks);

Jei naudojamas tiesiogiai ThreadPool, galima taikyti ManualResetEvent arba CountdownEvent laukimui:

CountdownEvent countdown = new CountdownEvent(3);

for (int i = 0; i < 3; i++)
{
    ThreadPool.QueueUserWorkItem(_ => {
        // darbas
        countdown.Signal(); // sumažinti skaitiklį
    });
}

// Laukti, kol baigsis visos užduotys
countdown.Wait();

Taip laukimo mechanizmas grindžiamas gijų sinchronizacija ir naudojant specialius metodus bei klases, blokuojančias dabartinę giją iki visos pradėtos užduotys bus baigtos.