Programavimas

Darbas su siūlų saugiomis kolekcijomis: „ConcurrentStack“ ir „ConcurrentQueue“

Saugų siūlų rinkiniai pirmą kartą buvo pristatyti .net 4 sistemoje, įvedus sistemą.Collections.Concurrent namespace. Kolekcijos tipai sistemoje „System.Collections.Concurrent“ vardų srityje yra saugių gijų rinkimo klasių rinkinys.

„ConcurrentStack“

Šūsnis yra duomenų struktūra, veikianti LIFO (paskutinis iš pirmojo) principu. „ConcurrentStack“ klasė yra bendrosios „Stack“ klasės atitikmuo siūlams. „ConcurrentStack“ yra gijų saugojimo bendroji rinkimo klasė, kuri pirmą kartą buvo pristatyta kaip .Net Framework 4 dalis. Čia pateikiamas svarbių šios klasės metodų, iliustruojančių galimas operacijas, sąrašas.

  1. Push (T elementas) - šis metodas naudojamas T tipo duomenims pridėti.
  2. „PushRange“ - šiuo metodu galima pridėti T tipo elementų masyvą.
  3. TryPop (out T) - šis metodas naudojamas norint gauti pirmąjį elementą iš kamino. Tai grįžta teisingai į sėkmę, klaidinga kitaip.
  4. TryPeek (out T) - šis metodas naudojamas norint gauti kitą elementą iš kamino, tačiau jis nepašalina elemento iš kamino. Atkreipkite dėmesį, kad panašiai kaip „TryPop“ (iš T) metodas, jis grįžta į teisingą sėkmę ir neteisingą.
  5. „TryPopRange“ - šis metodas yra perkrautas ir veikia panašiai kaip „TryPop“, tačiau naudojamas masyvams iš krūvos sugrąžinti

Štai kaip galite sukurti „ConcurrentStack“ klasės egzempliorių ir perkelti į jį duomenis.

ConcurrentStack concurrentStack = new ConcurrentStack ();

už (Int32 indeksas = 0; indeksas <10; indeksas ++)

{

concurrentStack.Push (rodyklė);

}

Norėdami gauti elementus iš tuo pačiu kamino, galite panaudoti „TryPop“ (iš T) metodą, kaip parodyta žemiau.

Int32 duomenys;

„Bool“ sėkmė = concurrentStack.TryPop (iš duomenų);

Šiame kodų sąraše parodyta, kaip galite saugoti ir gauti duomenis iš tuo pačiu kamino ir iš jo.

static void Main (string [] args)

       {

ConcurrentStack concurrentStack = new ConcurrentStack ();

už (Int32 indeksas = 0; indeksas <100; indeksas ++)

           {

concurrentStack.Push (rodyklė);

           }

while (concurrentStack.Count> 0)

           {

Int32 duomenys;

„Bool“ sėkmė = concurrentStack.TryPop (iš duomenų);

jei (sėkmė)

              {

Console.WriteLine (duomenys);

               }

           }

Pultas.Skaitykite ();

       }

Kai vykdote pirmiau pateiktą kodų sąrašą, skaičiai nuo 0 iki 99 konsolės lange bus rodomi atvirkštine tvarka.

„ConcurrentQueue“

Eilė yra duomenų struktūra, veikianti remiantis FIFO („first in first out“). „ConcurrentQueue“ klasė .net veikia kaip saugi FIFO pagrindu sukurta bendroji eilė.

Toliau pateikiamas svarbių „ConcurrentQueue“ klasės metodų sąrašas.

  1. Enqueue (T elementas) - šis metodas naudojamas norint pridėti T tipo elementą į eilę
  2. TryPeek (out T) - šis metodas naudojamas norint gauti kitą elementą iš eilės, tačiau jis nepašalina elemento iš eilės. Šis metodas grįžta į teisingą sėkmę ir klaidingą, kai nepavyksta.
  3. TryDequeue (out T) - šis metodas naudojamas norint gauti pirmąjį elementą iš eilės. Priešingai nei „TryPeek“ (iš T) metodas, elementas pašalinamas iš eilės. Šis metodas grįžta į teisingą sėkmę ir klaidingą kitaip.

Šis kodo fragmentas parodo, kaip galite sukurti „ConcurrentQueue“ klasės egzempliorių sveikiems skaičiams saugoti.

ConcurrentQueue concurrentQueue = nauja ConcurrentQueue ();

Norėdami išsaugoti elementus tuo pačiu metu esančios eilės egzemplioriuje, galite pasinaudoti Enqueue metodo pranašumais, kaip parodyta žemiau.

concurrentQueue.Enqueue (100);

Šiame kodų sąraše parodyta, kaip galite saugoti ir gauti elementus į ir iš eilės.

ConcurrentQueue concurrentQueue = nauja ConcurrentQueue ();

for (int indeksas = 0; indeksas <100; indeksas ++)

{

concurrentQueue.Enqueue (rodyklė);

}

Int32 prekė;

while (concurrentQueue.TryDequeue (elementas iš))

{

Console.WriteLine (elementas);

}

Kai atliksite pirmiau pateiktą kodų sąrašą, skaičiai nuo 0 iki 99 bus rodomi konsolės lange.

Atkreipkite dėmesį, kad tiek „ConcurrentStack“, tiek „ConcurrentQueue“ klasės yra saugios siūlams ir jos gali valdyti užrakinimo ir sinchronizavimo problemas viduje.

Taip pat galite konvertuoti lygiagrečią eilės egzempliorių į masyvą, paskambinę metodu ToArray (). Šis kodo fragmentas parodo, kaip tai galima pasiekti.

ConcurrentQueue concurrentQueue = nauja ConcurrentQueue ();

už (Int32 indeksas = 0; indeksas <100; indeksas ++)

concurrentQueue.Enqueue (rodyklė);

Int32 [] integerArray = concurrentQueue.ToArray ();

foreach (int i integerArray)

{

Console.WriteLine (i);

}

„ConcurrentQueue“ klasės ypatybė „IsEmpty“ grąžina tiesą, nes kolekcija yra tuščia, kitaip klaidinga. Šis kodo fragmentas parodo, kaip galite naudoti šį metodą.

ConcurrentQueue concurrentQueue = nauja ConcurrentQueue ();

už (Int32 indeksas = 0; indeksas <100; indeksas ++)

concurrentQueue.Enqueue (rodyklė);

while (! concurrentQueue.IsEmpty)

{

Int32 rezultatas;

concurrentQueue.TryDequeue (baigtas rezultatas);

Console.WriteLine (rezultatas);

}