Programavimas

Kaip dirbti su „ConcurrentBag“ ir „ConcurrentDictionary“ .Net

„Net“ rinkiniai yra sistemoje „System.Collections“. Šiuo metu esanti vardų sritis suteikia kolekcijos klasių neribotą ir saugų diegimą. Saugios siūlų kolekcijos pirmą kartą buvo pristatytos „.Net 4“, o kolekcijos pirmą kartą buvo pristatytos kaip .Net Framework 1.0 dalis ir buvo pasiekiamos sistemoje „System.Collections“.

Jei norite dirbti su kolekcijomis, galite pasinaudoti tuo pačiu metu vykstančių kolekcijų privalumais, o tai nereikalauja rašyti papildomo kodo sinchronizavimui. Galite peržiūrėti mano straipsnį apie „ConcurrentStack“ ir „ConcurrentQueue“.

„ConcurrentBag“

„ConcurrentBag“ suteikia saugų siūlų nerūšiuotų elementų rinkinį. Pateikiame svarbių „ConcurrentBag“ klasės metodų sąrašą.

  • Pridėti (T elementas) - šis metodas naudojamas elementui pridėti prie „ConcurrentBag“.
  • TryPeek (out T) - Šis metodas naudojamas norint gauti elementą iš „ConcurrentBag“ jo nepašalinant.
  • TryTake (out T) - Šis metodas naudojamas norint nuskaityti elementą iš „ConcurrentBag“. Atminkite, kad šis metodas pašalina elementą iš kolekcijos.

Šis kodo fragmentas iliustruoja, kaip galite sukurti „ConcurrentBag“ kolekciją ir joje laikyti daiktus.

ConcurrentBag concurrentBag = naujas ConcurrentBag ();

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

    {

concurrentBag.Add (i);

    }

Jei turėtumėte gauti elementus kolekcijoje, turėtumėte parašyti šį kodą:

while (concurrentBag.Count> 0)

  {

Int32 elementas;

jei (concurrentBag.TryTake (elementas iš))

       {

Console.WriteLine (elementas);

       }

  }

Atkreipkite dėmesį į tai, kaip buvo naudojamas „TryTake“ metodas: jis grąžina teisingą rezultatą į sėkmę, neteisingą - kitaip. „TryTake“ metodas taip pat pašalina elementą iš kolekcijos. „Loop“ tęsia vykdymą, kol kolekcijos elementų skaičius bus didesnis nei nulis. Čia pateikiamas visas jūsų kodų sąrašas.

static void Main (string [] args)

        {

ConcurrentBag concurrentBag = naujas ConcurrentBag ();

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

            {

concurrentBag.Add (i);

            }

while (concurrentBag.Count> 0)

            {

Int32 elementas;

jei (concurrentBag.TryTake (elementas iš))

                {

Console.WriteLine (elementas);

                }

            }

Pultas.Skaitykite ();

        }

„ConcurrentDictionary“

Žodynas yra bendras raktų / reikšmių porų rinkinys. Tai greitesnė nei „Hashtable“, nes pašalina bokso ir neišpakavimo pridėtines išlaidas. „ConcurrentDictionary“ yra sistemoje „System.Collections“. „Concurrent“ vardų sritis ir reiškia saugų siūlų žodyną.

Svarbūs „ConcurrentDictionary“ klasės nariai yra šie:

  • „TryAdd“: Šis metodas naudojamas elementui pridėti „ConcurrentDictionary“ egzemplioriuje. Atminkite, kad šis metodas sukuria išimtį, jei raktas jau yra kolekcijoje.
  • TryGetValue: Šis metodas naudojamas norint gauti elementą iš kolekcijos.
  • TryRemove: Šis metodas naudojamas norint pašalinti elementą iš kolekcijos.
  • „TryUpdate“: Šis metodas naudojamas atnaujinant konkretų raktą „ConcurrentDictionary“ egzemplioriuje pateikiant naują vertę.

Šis kodo fragmentas rodo, kaip galite sukurti „ConcurrentDictionary“ egzempliorių ir pridėti elementų prie jo:

ConcurrentDictionary obj = new ConcurrentDictionary ();

obj.TryAdd ("X001", "Tai yra pirmoji reikšmė.");

obj.TryAdd ("X002", "Tai yra antroji reikšmė.");

Jei dabar bandysite pridėti kitą elementą, bet naudodami tą patį raktą, jis nepavyks. Žr. Toliau pateiktą kodo fragmentą.

„Bool“ sėkmė = obj.TryAdd ("X002", "Tai yra trečioji reikšmė");

Sėkmės kintamojo vertė yra „klaidinga“, nes bandymas pridėti vertę tuo pačiu raktu nepavyksta.

Šis kodo fragmentas parodo, kaip galite gauti elementą iš kolekcijos, remdamiesi raktu.

eilutės elementas = null;

„Bool isExist“ = obj.TryGetValue („X001“, out elementas);

Jei norėtumėte gauti visus kolekcijos elementus, vietoj to galite naudoti šį kodo fragmentą.

foreach (var v in obj)

    {

Console.WriteLine (v.Key + "---" + v.Value);

    }

Šis kodo fragmentas parodo, kaip galite pašalinti elementą iš kolekcijos.

eilutės elementas = null;

„Bool“ rezultatas = obj.TryRemove („X001“, „out“ elementas);

Jei pašalintumėte visus elementus, vietoj jo galima naudoti šį kodo fragmentą.

obj. Aišku ();

Dabar apsvarstykite šiuos du statinius metodus.

static void „FirstTask“ („ConcurrentDictionary obj“)

        {

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

            {

obj.TryAdd (i.ToString (), i.ToString ());

Gija. Miegas (100);

            }

        }

static void SecondTask („ConcurrentDictionary obj“)

        {

Siūlai. Miegas (1000);

foreach (var obj in obj)

            {

Console.WriteLine ("Raktas:" + item.Key + "Reikšmė:" + item.Value);

Gija. Miegas (100);

            }

        }

Štai kaip galite atlikti minėtus du metodus dviem užduoties egzemplioriais vienu metu - vienas vertėms išsaugoti kolekcijoje, kitas - rinkinio reikšmėms skaityti.

ConcurrentDictionary obj = naujas ConcurrentDictionary ();

Užduotis firstTask = Task.Run (() => FirstTask (obj));

Užduotis secondTask = Task.Run (() => SecondTask (obj));

bandyti

{

Task.WaitAll (firstTask, secondTask);

}

sugavimas („AggregateException ex“)

{

// Čia įrašykite savo kodą, kad galėtumėte tvarkyti išimtį

}

Jei vykdysite pirmiau nurodytą kodą, išimtis nebus išmetama, nes kolekcija čia yra saugi.

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