2011-10-04 15 views
5

Eşzamanlı öğelerle eşzamanlı olarak BlockingCollection var. Farklı öğeler eklemek veya almak için nasıl değiştirebilirim?Eşzamanlı Koleksiyonlar ve Benzersiz öğeler

+1

Farklı öğeler eklemek [şaşırtıcı derecede zor] gibi görünüyor (http://stackoverflow.com/questions/6603969/how-to-access-the-underlying-default-concurrent-que-a-a-blocking-collection) imkansız değilse. 'BlockingCollection' IEnumerable ' özelliğini uygular, böylece Distinct() 'işlevini kullanabilirsiniz. –

+0

GertArnold tarafından bağlantılı StackOverflow sorusunda sağlanan kodu kullanabilirsiniz, ancak sadece bir IProducerConsumerCollection öğesinin TryAdd ve TryTake uygulamasında her zaman doğrudur. Bu işe yarayacaktı. Bunun korkunç bir form olduğunu biliyorum ama işe yarayacak ve BlockingCollection zaten bir istisna atarak formunu kırıyor. Ne kadar sinir bozucu. – Kevek

cevap

4

BlockingCollection için varsayılan yedekleme deposu ConcurrentQueue'dur. Başka birinin işaret ettiği gibi, bunu kullanarak farklı öğeler eklemek oldukça zordur. Ancak, IProducerConsumerCollection'u uygulayan kendi koleksiyon türünüzü oluşturabilir ve bunu BlockingCollection yapıcısına iletebilirsiniz.

Şu anda kuyrukta bulunan öğelerin anahtarlarını içeren bir ConcurrentDictionary düşünün. Bir öğe eklemek için, önce sözlükte TryAdd'u, öğeyi eklemediğiniz sözlükte değil ve kuyruğa ekleyin. Take (ve TryTake) sıradaki sonraki öğeyi alır, onu sözlükten kaldırır ve geri döndürür.

Eşzamanlı bir HashTable varsa tercih ederim, ancak bir tane olmadığından, ConcurrentDictionary ile yapmanız gerekecek.