Programmēšana

Kā strādāt ar BlockingCollection C #

Apsveriet scenāriju, kurā vairāki pavedieni būtu lasīšana un rakstīšana rindā. Konkrētāk, jums var būt vienā brīdī vairāki ražotāji, kas glabā datus, un vairāki patērētāji tos iegūst no kopēja datu krājuma. Tādējādi, lai sinhronizētu piekļuvi šiem datiem, jums būs nepieciešams piemērots sinhronizācijas mehānisms.

Lūk, tieši šeit palīdz BlockingCollection klase. Lai gan ir daudz citu veidu, šī klase nodrošina vienu no efektīvākajiem veidiem, kā sinhronizēt piekļuvi jūsu datiem. Klase BlockingCollection pieder System.Collections.Concurrent vārdamvietai.

Kas ir BlockingCollection?

BlockingCollection ir vītnēm droša kolekcija, kurā vienlaikus var pievienot un noņemt vairākus pavedienus. Tas tiek attēlots .Net, izmantojot klasi BlockingCollection; jūs varat izmantot šo klasi, lai ieviestu ražotāja un patērētāja modeli.

Ražotāja un patērētāja modelī jums ir divas atšķirīgas sastāvdaļas, kas darbojas uz diviem dažādiem pavedieniem. Tajos ietilpst ražotāja komponents, kas ražo dažus datus, kas tiek virzīti rindā, un patērētājs, kas patērē rindā saglabātos datus. Izmantojot BlockingCollection, varat norādīt ierobežoto ietilpību, kā arī kolekcijas veidu, kuru vēlaties izmantot.

BlockingCollection tips darbojas kā iesaiņotājs pār IProducerConsumerCollection tipa gadījumu. Citiem vārdiem sakot, tas darbojas kā iesaiņojums citai kolekcijai, kas savukārt ievieš interfeisu IProducerConsumerCollection. Piemēram, klases ConcurrentBag, ConcurrentQueue un ConcurrentStack var izmantot kopā ar BlockingCollection, jo visi no tiem ievieš interfeisu IProducerConsumerCollection.

Ņemiet vērā, ka interfeiss IProducerConsumerCollection satur metožu deklarāciju, kuras var izmantot, strādājot ar vītnēm drošām kolekcijām. MSDN norāda: "Definē metodes, kā manipulēt ar vītnēm drošām kolekcijām, kas paredzētas ražotāja / patērētāja lietošanai. Šī saskarne nodrošina vienotu pārstāvību ražotāju / patērētāju kolekcijās, lai augstāka līmeņa abstrakcijas, piemēram, System.Collections.Concurrent.BlockingCollection, kolekciju varētu izmantot kā pamatā esošo uzglabāšanas mehānismu. "

Šis koda fragments parāda, kā varat izveidot virkņu BlockingCollection gadījumu.

var blockingCollection = new BlockingCollection ();

Izmantojot BlockingCollection, datus kolekcijai varat pievienot, izmantojot metodi Add vai TryAdd. Tagad sapratīsim atšķirību starp šīm divām metodēm.

BlockingCollection data = new BlockingCollection (boundedCapacity: 3);

dati.Pievienot (1);

dati.Pievienot (2);

dati.Pievienot (3);

dati.Pievienot (4); // Tas bloķētu, līdz vienums tiek noņemts no kolekcijas.

Ievērojiet, kā mēs esam norādījuši ierobežotu kapacitāti, veidojot BlockingCollection gadījumu, kā parādīts iepriekš sniegtajā koda fragmentā. Tas ir norādīts, lai norādītu ierobežoto kolekcijas instances lielumu.

Lai pievienotu vienumu BlockingCollection instancei, varat izmantot arī metodi TryAdd. Šajā metodē varat izmantot taimauta vērtību. Ja pievienošanas darbība neizdodas norādītajā laikā, metode TryAdd atgriež vērtību false. Šis koda fragments parāda, kā jūs varat izmantot TryAdd metodes priekšrocības, lai pievienotu vienumu BlockingCollection gadījumam.

BlockingCollection data = new BlockingCollection (boundedCapacity: 3);

dati.Pievienot (1);

dati.Pievienot (2);

dati.Pievienot (3);

ja (dati.TryAdd (4, TimeSpan.FromMilliseconds (100)))

{

Console.WriteLine ("Kolekcijai tika veiksmīgi pievienots jauns vienums.");

}

cits

{

Console.WriteLine ("Neizdevās kolekcijai pievienot jaunu vienumu.");

}

Lai noņemtu vienumu no bloķēšanas kolekcijas, varat izmantot metodi Take vai TryTake. Ņemiet vērā, ka metode Take tiek bloķēta, ja kolekcijā nav neviena vienuma, un tiek atbloķēta, tiklīdz kolekcijai tiek pievienots jauns vienums. TryTake metodi var izmantot arī, lai noņemtu vienumu no BlockingCollection gadījuma. Izmantojot šo metodi, varat norādīt taimauta vērtību, lai metode bloķētu (līdz brīdim, kad ir pagājis norādītais laiks), līdz vienums tiek pievienots kolekcijai. Ja vienumu šajā laikā nevarēja noņemt no kolekcijas (norādītais taimauts), metode TryTake atgriež vērtību false.

Šis koda fragments parāda, kā TryTake metodi var izmantot, lai noņemtu vienumu no BlockingCollection tipa instances.

int prece;

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

{

Console.WriteLine (vienums);

}

Šeit ir pieejams pilns kodu saraksts. Šī programma parāda, kā jūs varat izmantot BlockingCollection, lai pievienotu un noņemtu vienumus kolekcijā un no tās.

klases programma

   {

privāti statiski BlockingCollection dati = new BlockingCollection ();

privāts statisks anulējums Ražotājs ()

       {

par (int ctr = 0; ctr <10; ctr ++)

           {

dati.Pievienot (ctr);

Vītne.Guli (100);

           }

       }

private static void Patērētājs ()

       {

foreach (datu mainīgais vienums. GetConsumingEnumerable ())

           {

Console.WriteLine (vienums);

           }

       }

static void Main (virkne [] args)

       {

var producer = Uzdevums.Factory.StartNew (() => Producer ());

var patērētājs = Task.Factory.StartNew (() => Patērētājs ());

Konsole. Lasīt ();

       }

   }

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