Megosztás a következőn keresztül:


Adatstruktúrák párhuzamos programozáshoz

A .NET számos olyan típust biztosít, amelyek hasznosak a párhuzamos programozásban, beleértve az egyidejű gyűjteményosztályokat, az egyszerűsített szinkronizálási primitíveket és a lusta inicializáláshoz szükséges típusokat. Ezeket a típusokat bármilyen többszálú alkalmazáskóddal használhatja, beleértve a feladat párhuzamos kódtárát és a PLINQ-t.

Párhuzamos gyűjteményosztályok

A System.Collections.Concurrent névtér gyűjteményosztályai szálbiztos hozzáadási és eltávolítási műveleteket biztosítanak, amelyek lehetőség szerint elkerülik a zárolásokat, és finomszemcsés zárolást alkalmaznak, ahol szükség van a zárolások elkerülésére. Az egyidejű gyűjteményosztály nem követeli meg a felhasználói kódtól, hogy zárolások használata nélkül férjen hozzá az elemekhez. Az egyidejű gyűjteményosztályok jelentősen javíthatják a teljesítményt, különösen az olyan típusokhoz képest, mint például System.Collections.ArrayList és System.Collections.Generic.List<T>, ahol felhasználó által implementált zárolást alkalmaznak. Ez különösen igaz olyan helyzetekben, amikor több szál hozzáad és eltávolít elemeket egy gyűjteményből.

Az alábbi táblázat az egyidejű gyűjteményosztályokat sorolja fel:

típus Leírás
System.Collections.Concurrent.BlockingCollection<T> Biztosít letiltási és határolási képességet a System.Collections.Concurrent.IProducerConsumerCollection<T>-t implementáló szálbiztos gyűjteményekhez. A gyártói szálak blokkolódnak, ha nincsenek rendelkezésre álló helyek, vagy ha a kollekció megtelt. A fogyasztói szálak blokkolva vannak, ha a kollekció üres. Ez a típus támogatja a fogyasztók és termelők nem blokkoló hozzáférését. A BlockingCollection<T> alaposztályként vagy háttértárként használható, amely blokkolást és határolást biztosít minden olyan gyűjteményosztály számára, amely támogatja a IEnumerable<T>-t.
System.Collections.Concurrent.ConcurrentBag<T> Egy szálbiztos zsák implementáció, amely skálázható hozzáadási és lekérési műveleteket biztosít.
System.Collections.Concurrent.ConcurrentDictionary<TKey,TValue> Egyidejű és méretezhető szótártípus.
System.Collections.Concurrent.ConcurrentQueue<T> Egyidejű és méretezhető FIFO-üzenetsor.
System.Collections.Concurrent.ConcurrentStack<T> Egyidejű és méretezhető LIFO-verem.

További információ: Thread-Safe Gyűjtemények.

Szinkronizálási primitívek

A System.Threading névtérben található szinkronizálási primitívek lehetővé teszik a részletes egyidejűséget és a gyorsabb teljesítményt azáltal, hogy elkerülik a régebbi többszálú kódban található költséges zárolási mechanizmusokat.

Az alábbi táblázat a szinkronizálási típusokat sorolja fel:

típus Leírás
System.Threading.Barrier Lehetővé teszi, hogy több szál párhuzamosan működjön egy algoritmuson azáltal, hogy megad egy pontot, ahol minden tevékenység jelezheti az érkezését, majd blokkolhatja, amíg néhány vagy az összes tevékenység meg nem érkezik. További információ: Barrier.
System.Threading.CountdownEvent Egyszerű találkozási mechanizmust biztosít az elágazási és csatlakozási forgatókönyvek egyszerűsítéséhez. További információ: CountdownEvent.
System.Threading.ManualResetEventSlim A szinkronizálási primitív hasonló a System.Threading.ManualResetEvent. ManualResetEventSlim kisebb súlyú, de csak a folyamaton belüli kommunikációhoz használható.
System.Threading.SemaphoreSlim A szinkronizálási primitív, amely korlátozza az erőforrásokhoz vagy erőforráskészletekhez egyidejűleg hozzáférő szálak számát. További információ: Semaphore és SemaphoreSlim.
System.Threading.SpinLock A kölcsönös kizárási zár primitív, amely miatt a szál, amely megpróbálja megszerezni a zárolást, egy ideig egy ciklusban várakozik, vagy spin helyzetbe kerül, mielőtt átadná a futási idő kvantumát. Azokban az esetekben, amikor a zárolásra való várakozás várhatóan rövid lesz, jobb teljesítményt nyújt, SpinLock mint más zárolási formák. További információ: SpinLock.
System.Threading.SpinWait Egy kis, könnyű típus, amely meghatározott ideig pörög, és végül várakozási állapotba helyezi a szálat, ha túllépi a pörgetések számát. További információ: SpinWait.

További információkért lásd:

Lusta inicializálási osztályok

Lusta inicializálás esetén az objektum memóriája csak akkor van lefoglalva, ha szükség van rá. A lusta inicializálás javíthatja a teljesítményt azáltal, hogy egyenletesen szórja el az objektumfoglalásokat a program teljes élettartama alatt. A lusta inicializálást bármely egyéni típushoz engedélyezheti a típus Lazy<T>körbefuttatásával.

Az alábbi táblázat a lusta inicializálási típusokat sorolja fel:

típus Leírás
System.Lazy<T> Könnyű, szálbiztos késleltetett inicializálást biztosít.
System.Threading.ThreadLocal<T> Szálanként biztosít egy lustán inicializált értéket, minden szál lusta módon hívja meg az inicializáló függvényt.
System.Threading.LazyInitializer Statikus metódusokat biztosít, amelyek nem igényelnek dedikált, lusta inicializálási példányt. Ehelyett hivatkozásokkal biztosítják, hogy a célok inicializálva legyenek, mire hozzáférnek hozzájuk.

További információ: Késleltetett inicializálás.

Kivételek összesítése

Ez a System.AggregateException típus több kivétel rögzítésére használható, amelyek egyidejűleg külön szálakra kerülnek, és egyetlen kivételként visszakerülnek az illesztőszálba. A System.Threading.Tasks.Task és a System.Threading.Tasks.Parallel típusokat, valamint a PLINQ-t széles körben használják AggregateException ezen cél érdekében. További információ: Kivételkezelés és útmutató: Kivételek kezelése PLINQ-lekérdezésekben.

Lásd még