Aracılığıyla paylaş


Thread-safe koleksiyonlar

Ad alanı System.Collections.Concurrent hem iş parçacığı açısından güvenli hem de ölçeklenebilir çeşitli koleksiyon sınıfı içerir. Birden çok iş parçacığı, kullanıcı kodunda ek eşitleme gerektirmeden bu koleksiyonlardaki öğeleri güvenli ve verimli bir şekilde ekleyebilir veya kaldırabilir. Yeni kod yazarken, eşzamanlı koleksiyon sınıflarını kullanarak koleksiyona eşzamanlı olarak birden çok iş parçacığı yazın. Yalnızca paylaşılan bir koleksiyondan okuyorsanız, ad alanında System.Collections.Generic sınıfları kullanabilirsiniz.

System.Collections ve System.Collections.Generic

Ad alanındaki System.Collections koleksiyon sınıfları, ArrayList ve Hashtable sınıflarını içerir. Bu sınıflar, özelliği aracılığıyla Synchronized bazı iş parçacığı güvenliği sağlar ve bu da koleksiyonun çevresinde iş parçacığı güvenli sarmalayıcı döndürür. Sarmalayıcı, her ekleme veya kaldırma işleminde koleksiyonun tamamını kilitleyerek çalışır. Bu nedenle, koleksiyona erişim için her iş parçacığı sırasını beklemek ve tek bir kilidi almak zorundadır. Bu işlem ölçeklenebilir değildir ve büyük koleksiyonlar için önemli performans düşüşlerine neden olabilir. Ayrıca tasarım, yarış koşullarından korunmaz. Daha fazla bilgi için bkz. Genel Koleksiyonlarda Eşitleme.

Ad alanındaki System.Collections.Generic koleksiyon sınıfları, List<T> ve Dictionary<TKey,TValue> sınıflarını içerir. Bu sınıflar, System.Collections sınıflarına kıyasla daha iyi tür güvenliği ve performans sağlar. Ancak sınıflar System.Collections.Generic herhangi bir iş parçacığı eşitlemesi sağlamaz; öğeler birden çok iş parçacığına eş zamanlı olarak eklendiğinde veya kaldırıldığında kullanıcı kodu tüm eşitlemeyi sağlamalıdır.

Eşzamanlı koleksiyon sınıflarını, tür güvenliği sağlamalarının yanı sıra daha verimli ve kapsamlı iş parçacığı güvenliği sundukları için System.Collections.Concurrent alanında kullanmanızı öneririz.

İnce taneli kilitleme ve kilitsiz mekanizmalar

Eşzamanlı koleksiyon türlerinden bazıları SpinLock, SpinWait, SemaphoreSlim ve CountdownEvent gibi basit eşitleme mekanizmalarını kullanır. Bu eşitleme türleri genellikle iş parçacığını gerçek duruma geçirmeden önce kısa süreler için Wait kullanır. Bekleme sürelerinin kısa olması beklendiğinde, döndürme işlemi, hesaplama açısından beklemekten çok daha az maliyetlidir, bu da pahalı bir çekirdek geçişini gerektirir. Bu verimlilik, dönen koleksiyon sınıflarını kullanan birden çok iş parçacığının aynı anda çok sayıda öğe ekleyip kaldırabilmesi anlamına gelir. Döndürme ve engelleme hakkında daha fazla bilgi için bkz SpinLock ve SpinWait.

ConcurrentQueue<T> ve ConcurrentStack<T> sınıfları kilitleri hiç kullanmaz. Bunun yerine, Interlocked işlemlerine güvenirler iş parçacığı güvenliğini sağlamak için.

Uyarı

Eşzamanlı koleksiyon sınıfları ICollection destekledikleri için, bu koleksiyonlar IsSynchronized ve SyncRoot özellikleri için implementasyonlar sağlarlar, bu özellikler ilgisiz olsa bile. IsSynchronized her zaman false döndürür ve SyncRoot her zaman null (Nothing Visual Basic'te).

Aşağıdaki tabloda ad alanında System.Collections.Concurrent koleksiyon türleri listelenmiştir:

Türü Açıklama
BlockingCollection<T> IProducerConsumerCollection<T> uygulayan her tür için sınırlayıcı ve engelleme işlevselliği sağlar. Daha fazla bilgi için bkz . BlockingCollection'a Genel Bakış.
ConcurrentDictionary<TKey,TValue> Anahtar-değer çiftlerinden oluşan bir sözlüğün iş parçacığı güvenli bir uygulaması.
ConcurrentQueue<T> FIFO (ilk gelen, ilk çıkar) kuyruğunun iş parçacığı güvenli uygulaması.
ConcurrentStack<T> İş parçacığına güvenli bir LIFO (son giren, ilk çıkan) yığını uygulaması.
ConcurrentBag<T> Sıralanmamış bir öğe koleksiyonunun iş parçacığı güvenli uygulaması.
IProducerConsumerCollection<T> Bir türün BlockingCollection içinde kullanılabilmesi için uygulaması gereken arayüz.
Başlık Açıklama
BlockingCollection'a Genel Bakış BlockingCollection<T> türü tarafından sağlanan işlevselliği açıklar.
Nasıl yapılır: ConcurrentDictionary'de Öğe Ekleme ve Kaldırma Öğeleri nasıl ekleyeceğinizi ve çıkaracağınızı açıklar ConcurrentDictionary<TKey,TValue>
Nasıl yapılır: Bir BlockingCollection'dan Öğeleri Tek Tek Ekleme ve Alma Salt okunur numaralandırıcı kullanılmadan engelleyici bir koleksiyondan öğe ekleme ve alma işlemleri açıklanır.
Nasıl yapılır: Bir Koleksiyona Sınırlayıcı ve Engelleme İşlevselliği Ekleme Bir koleksiyon için temel depolama mekanizması olarak herhangi bir IProducerConsumerCollection<T> koleksiyon sınıfının nasıl kullanılacağını açıklar.
Nasıl yapılır: Bir BlockingCollection'daki Öğeleri Kaldırmak için ForEach Kullanma foreach'ü (Visual Basic'te For Each kullanarak) bir engelleme koleksiyonundaki tüm öğeleri nasıl kaldıracağınızı açıklar.
Nasıl yapılır: İşlem Hattında Engelleme Koleksiyonları Dizilerini Kullanma Birden fazla bloklama koleksiyonunu aynı anda kullanarak bir pipeline nasıl uygulanacağını açıklar.
Nasıl yapılır: ConcurrentBag Kullanarak Nesne Havuzu Oluşturma Sürekli yenilerini oluşturmak yerine nesneleri yeniden kullanabileceğiniz senaryolarda performansı artırmak için eşzamanlı çantanın nasıl kullanılacağını gösterir.

Kaynak