Programavimas

Kaip dirbti su „BlockingCollection“ C #

Apsvarstykite scenarijų, kai kelios gijos būtų skaitomos ir rašomos į eilę. Tiksliau tariant, tuo pačiu metu gali būti, kad keli gamintojai saugo duomenis, o keli vartotojai juos renka iš bendros duomenų saugyklos. Taigi, norint sinchronizuoti prieigą prie šių duomenų, jums reikės tinkamo sinchronizavimo mechanizmo.

Čia tiksliai gelbėja „BlockingCollection“ klasė. Nors yra daugybė kitų būdų, ši klasė yra vienas iš efektyviausių būdų sinchronizuoti prieigą prie jūsų duomenų. „BlockingCollection“ klasė priklauso „System.Collections.Concurrent“ vardų sričiai.

Kas yra „BlockingCollection“?

„BlockingCollection“ yra saugi gijoms kolekcija, kurioje galite, kad kelios gijos vienu metu pridėtų ir pašalintų duomenis. Tai atstovaujama .Net per „BlockingCollection“ klasę; galite naudoti šią klasę, kad įgyvendintumėte gamintojo ir vartotojo modelį.

Pagal gamintojo ir vartotojo modelį turite du skirtingus komponentus, kurie veikia dviem skirtingomis gijomis. Tai apima gamintojo komponentą, kuris sukuria tam tikrus duomenis, kurie nustumiami į eilę, ir vartotoją, kuris sunaudoja eilėje saugomus duomenis. Kai naudojate „BlockingCollection“, galite nurodyti ribotą talpą ir norimo naudoti rinkinio tipą.

„BlockingCollection“ tipas veikia kaip „IProducerConsumerCollection“ tipo egzemplioriaus paketas. Kitaip tariant, jis veikia kaip kitos kolekcijos paketas, kuris savo ruožtu įgyvendina „IProducerConsumerCollection“ sąsają. Pavyzdžiui, „ConcurrentBag“, „ConcurrentQueue“ ir „ConcurrentStack“ klasės gali būti naudojamos su „BlockingCollection“, nes visos jos įdiegia „IProducerConsumerCollection“ sąsają.

Atminkite, kad sąsajoje „IProducerConsumerCollection“ pateikiama metodų, kuriuos galima naudoti dirbant su siūlų saugomomis kolekcijomis, deklaracija. MSDN teigiama: "Apibrėžia metodus, kaip manipuliuoti saugiomis siūlų kolekcijomis, skirtomis gamintojų / vartotojų naudojimui. Ši sąsaja suteikia vieningą gamintojų / vartotojų kolekcijų vaizdavimą, kad aukštesnio lygio abstrakcijos, tokios kaip System.Collections.Concurrent.BlockingCollection, kolekciją gali naudoti kaip pagrindinį saugojimo mechanizmą. "

Šis kodo fragmentas parodo, kaip galite sukurti „BlockingCollection“ eilučių egzempliorių.

var blockingCollection = new BlockingCollection ();

Naudodami „BlockingCollection“, galite pridėti duomenų prie kolekcijos naudodami metodą „Pridėti“ arba „TryAdd“. Dabar supraskime šių dviejų metodų skirtumą.

BlockingCollection data = new BlockingCollection (boundedCapacity: 3);

duomenys. Pridėti (1);

duomenys. Pridėti (2);

duomenys. Pridėti (3);

duomenys. Pridėti (4); // Tai būtų užblokuota, kol elementas bus pašalintas iš kolekcijos.

Atkreipkite dėmesį, kaip mes nurodėme „boundedCapacity“ kurdami „BlockingCollection“ egzempliorių, kaip parodyta aukščiau pateiktame kodo fragmente. Tai nurodyta norint nurodyti apribotą rinkinio egzemplioriaus dydį.

Norėdami pridėti elementą prie „BlockingCollection“ egzemplioriaus, taip pat galite naudoti „TryAdd“ metodą. Šiuo metodu galite naudoti skirtojo laiko reikšmę. Jei pridėjimo operacija nepavyksta per nurodytą laiką, „TryAdd“ metodas grąžina „false“. Šis kodo fragmentas parodo, kaip galite pasinaudoti „TryAdd“ metodo pranašumais norėdami pridėti elementą prie „BlockingCollection“ egzemplioriaus.

BlockingCollection data = new BlockingCollection (boundedCapacity: 3);

duomenys. Pridėti (1);

duomenys. Pridėti (2);

duomenys. Pridėti (3);

jei (duomenys.TryAdd (4, TimeSpan.FromMilliseconds (100)))

{

Console.WriteLine ("Naujas elementas sėkmingai pridėtas prie kolekcijos.");

}

Kitas

{

Console.WriteLine ("Nepavyko pridėti naujo elemento prie kolekcijos.");

}

Norėdami pašalinti elementą iš „BlockingCollection“, galite naudoti „Take“ arba „TryTake“ metodą. Atminkite, kad metodas „Take“ užblokuojamas, jei kolekcijoje nėra elementų, ir atblokuojamas iškart, kai prie kolekcijos pridedamas naujas elementas. „TryTake“ metodas taip pat gali būti naudojamas norint pašalinti elementą iš „BlockingCollection“ egzemplioriaus. Šiuo metodu galite nurodyti skirtąjį laiką, kad metodas blokuotų (kol praeis nurodytas laikas), kol elementas bus pridėtas prie kolekcijos. Jei per šį laiką nepavyko pašalinti elemento iš kolekcijos (nurodytas skirtasis laikas), „TryTake“ metodas pateikia klaidingą reikšmę.

Šis kodo fragmentas parodo, kaip „TryTake“ metodą galima naudoti norint pašalinti elementą iš „BlockingCollection“ tipo egzemplioriaus.

int punktas;

while (data.TryTake (out item, TimeSpan.FromMilliseconds (100)))

{

Console.WriteLine (elementas);

}

Čia yra visas jūsų kodo sąrašas. Ši programa parodo, kaip galite naudoti „BlockingCollection“, norėdami pridėti ir pašalinti elementus į kolekciją ir iš jos.

klasės programa

   {

privatūs statiniai „BlockingCollection“ duomenys = nauji „BlockingCollection“ ();

privatus statinis negaliojantis gamintojas ()

       {

už (int ctr = 0; ctr <10; ctr ++)

           {

duomenys.Pridėti (ctr);

Gija. Miegas (100);

           }

       }

privatus statinis negaliojantis vartotojas ()

       {

foreach (kintamasis duomenų elementas. GetConsumingEnumerable ())

           {

Console.WriteLine (elementas);

           }

       }

static void Main (string [] args)

       {

var producer = Užduotis.Factory.StartNew (() => Producer ());

var vartotojas = Task.Factory.StartNew (() => Consumer ());

Pultas.Skaitykite ();

       }

   }

$config[zx-auto] not found$config[zx-overlay] not found