İş Parçacığı Koleksiyonları
.NET Framework 4, hem iş parçacığı güvenli hem de ölçeklenebilir çeşitli koleksiyon sınıflarını içeren ad alanını tanıtırSystem.Collections.Concurrent. 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 yazdığınızda, koleksiyona aynı anda birden çok iş parçacığı yazdığında eşzamanlı koleksiyon sınıflarını kullanın. Yalnızca paylaşılan bir koleksiyondan okuyorsanız System.Collections.Generic ad alanındaki sınıfları kullanabilirsiniz. .NET Framework 1.1 veya önceki çalışma zamanı sürümünü hedeflemeniz gerekmedikçe 1.0 koleksiyon sınıflarını kullanmamanızı öneririz.
.NET Framework 1.0 ve 2.0 Koleksiyonlarındaki İş Parçacığı Eşitlemesi
.NET Framework 1.0'da tanıtılan koleksiyonlar System.Collections ad alanında bulunur. Sık kullanılan ArrayList ve Hashtable öğelerini içeren bu koleksiyonlar, koleksiyon etrafında bir iş parçacığı güvenlikli sarmalayıcıyı döndüren Synchronized
özelliği ile biraz iş parçacığı güvenliği sağlar. Sarmalayıcı, her ekleme veya kaldırma işleminde tüm koleksiyonu kilitleyerek çalışır. Bu nedenle, koleksiyona erişmeye çalışan her bir iş parçacığının bir kilidi almak için kendi sırasını beklemesi gerekir. Bu ölçeklenebilir değildir ve büyük koleksiyonlar için önemli performans düşüşüne neden olabilir. Ayrıca tasarım, yarış durumlarına karşı tamamen korumalı değildir. Daha fazla bilgi için bkz. Genel Koleksiyonlarda Eşitleme.
.NET Framework 2.0'da tanıtılan koleksiyon sınıfları System.Collections.Generic ad alanında bulunur. Bunlar List<T>, Dictionary<TKey,TValue> ve benzerlerini içerir. Bu sınıflar, .NET Framework 1.0 sınıfları ile karşılaştırıldığında geliştirilmiş tür güvenliği ve performans sağlar. Ancak, .NET Framework 2.0 koleksiyon sınıfları herhangi bir iş parçacığı eşitlemesi sağlamaz; kullanıcı kodunun, öğeler aynı anda birden çok iş parçacığına eklendiğinde veya kaldırıldığında tüm eşitlemeyi sağlaması gerekir.
yalnızca .NET Framework 2.0 koleksiyon sınıflarının tür güvenliğini sağlamakla kalmaz, aynı zamanda .NET Framework 1.0 koleksiyonlarının sağladığından daha verimli ve daha eksiksiz iş parçacığı güvenliği sağladığından .NET Framework 4'teki eşzamanlı koleksiyon sınıflarını öneririz.
Hassas Kilitleme ve Kilitsiz Mekanizmalar
Eşzamanlı koleksiyon türlerinden bazıları, .NET Framework 4'te yeni olan , SpinWaitSemaphoreSlim, ve CountdownEventgibi SpinLockbasit eşitleme mekanizmalarını kullanır. Bu eşitleme türleri genellikle iş parçacığını gerçek bir Bekleme durumuna geçirmeden önce kısa süreler için meşgul dönen kullanır. Bekleme sürelerinin çok kısa olması beklendiğinde pahalı bir çekirdek dönüşümünü içeren dönme beklemeden hesaplama açısından çok daha ucuzdur. Dönme kullanan koleksiyon sınıfları için bu verimlilik, birden çok iş parçacığının yüksek bir hızda öğe ekleyip kaldırabildiği 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, iş parçacığı güvenliğini sağlamak için Interlocked işlemlerine dayanırlar.
Not
Eşzamanlı koleksiyon sınıfları ICollection öğesini desteklediğinden, ilgisi olmasa bile IsSynchronized ve SyncRoot özellikleri için uygulama sağlarlar. IsSynchronized
her zaman false
'i döndürür ve SyncRoot
her zaman null
(Visual Basic'te Nothing
) olarak ayarlıdır.
Aşağıdaki tablo, System.Collections.Concurrent ad alanındaki koleksiyon türlerini listeler.
Tür | Description |
---|---|
BlockingCollection<T> | IProducerConsumerCollection<T> öğesini uygulayan herhangi bir tür için sınırlama ve engelleme işlevleri sağlar. Daha fazla bilgi için bkz . BlockingCollection'a Genel Bakış. |
ConcurrentDictionary<TKey,TValue> | Anahtar-değer çiftlerinin sözlüğünün iş parçacığı açısından güvenli uygulaması. |
ConcurrentQueue<T> | Bir FIFO (ilk giren ilk çıkar) sırasının iş parçacığı açısından güvenli uygulaması. |
ConcurrentStack<T> | Bir LIFO (son giren ilk çıkar) yığının iş parçacığı açısından güvenli uygulaması. |
ConcurrentBag<T> | Öğelerin sırasız koleksiyonunun iş parçacığı açısından güvenli uygulaması. |
IProducerConsumerCollection<T> | Bir türün BlockingCollection içinde kullanılabilmesi için uygulaması gereken ara birim. |
İlgili Konular
Başlık | Açıklama |
---|---|
BlockingCollection Genel Bakışı | BlockingCollection<T> türü tarafından sağlanan işlevselliği açıklar. |
Nasıl yapılır: Öğeleri Ekleme ve Bir ConcurrentDictionary'den Alma | Bir ConcurrentDictionary<TKey,TValue> öğesine öğelerin nasıl ekleneceğini ve kaldırılacağını açıklar. |
Nasıl yapılır: Öğeleri Tek Tek Ekleme ve Bir BlockingCollection'dan ve Alma | Salt okunur numaralayıcı kullanmadan bir engelleme koleksiyonundan öğelerin nasıl eklenip alınacağını açıklar. |
Nasıl yapılır: Koleksiyona Sınırlama ve Engelleme İşlevi Ekleme | Bir IProducerConsumerCollection<T> koleksiyonu için herhangi bir koleksiyon sınıfının temel depolama mekanizması olarak nasıl kullanılacağını açıklar. |
Nasıl yapılır: Bir BlockingCollection'daki Öğeleri Kaldırmak için ForEach Kullanma | Bir engelleme koleksiyondaki tüm öğeleri kaldırmak için foreach (Visual Basic'te For Each ) öğesinin nasıl kullanılacağını açıklar. |
Nasıl yapılır: Ardışık Düzende Engelleme Koleksiyonu Dizilerini Kullanma | Bir ardışık düzeni uygulamak için birden çok engelleme koleksiyonunun aynı anda nasıl kullanılacağı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ı torbaların nasıl kullanılacağını gösterir. |