2009-03-10 22 views
0

Kullanmak için kullanıyorum (kendi iş parçacığı güvenli sözlüğümü yazmayı düşündüğümde) Aşağıdaki uygulamayı buldum.ThreadSafe Dictionary ... Anahtar Değer Çiftleri Enumerable? (.net)

http://devplanet.com/blogs/brianr/archive/2008/09/26/thread-safe-dictionary-in-net.aspx

Genellikle oldukça iyi görünüyor, ama beni karıştırır bir şey var.

Aşağıdakiler: Bir threadafe sözlüğü numaralandırılamıyor. Bunun yerine, anahtarlarını numaralandırmak veya değerleri hem bulunursa koleksiyon

public virtual IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator() 
{ 
    throw new NotSupportedException("Cannot enumerate a threadsafe dictionary. Instead, enumerate the keys or values collection"); 
} 


IEnumerator IEnumerable.GetEnumerator() 
{ 
    throw new NotSupportedException("Cannot enumerate a threadsafe dictionary. Instead, enumerate the keys or values collection"); 
} 

Ben anahtarları veya değerleri değil, sözlüğün kvp en numaralandırmak için ok neden olduğu alamadım ne olacak?

Bu benim için biraz ışık tutabilir mi? Şimdiden teşekkürler.

cevap

4

SO kullanıcı ve MS çalışanı JaredPar zaman kesinlikle değer ÅŸan koleksiyonları bina blogunda kısa bir dizi vardır:

[Güncelleme:]
Onları tekrar gözden geçirin, eğer kısacıksanız, 2. makale muhtemelen kendi üzerinde durabilir.

özetlemek gerekirse: en "threadsafe" koleksiyonları online yayınlanmıştır bulmak onlar tarafından "bayat" konum (genellikle ya çok kullanışlı olmayan veya sadece "karar" üyeleri .Count gibi ya .Contains yararsız hale bir saatte güvenli bir operasyon iplik Sonraki kod satırı çalışır.

1

KVP koleksiyonu üzerinde numaralandırma yaptığınızda, tüm sözlük için kilit içine girip çıkıyorsunuz. Yani sayımınızın döngü gövdesinde kilitte değilsiniz ve KVP'yi değiştirmek bir yarış koşuluna neden olabilir. Ben Sözlük :)

iç KVP setleri bir başvuru alacak sözlüğe bir sýralayýcý edinme yazdı beri

1

Ben, doğrudan bu sorunun yanıtını verebilir. Okuma kilidini siz sayım işlemini bitirene kadar tutmalısınız, bu uzun bir süre olabilir.

yerine anahtarları veya değerleri numaralandırılamıyor söylemek nedeni olduğunu ben kopya anahtarlar ve değerler listesi, istendiğinde, bu yüzden size değişmiş ise sözlüklerde iç liste, bir başvuru dönen değilim Kilit dışında sorunlara neden olabilir. Her ne kadar, aynı modeli KVP'lerde de uygulayabiliyor olsanız da, sadece okunduklarından beri de isteyebilirsiniz.

public virtual ICollection<TKey> Keys 
    { 
     get 
     { 
      using (new ReadOnlyLock(this.dictionaryLock)) 
      { 
       return new List<TKey>(this.dict.Keys); 
      } 
     } 
    } 

    public virtual ICollection<TValue> Values 
    { 
     get 
     { 
      using (new ReadOnlyLock(this.dictionaryLock)) 
      { 
       return new List<TValue>(this.dict.Values); 
      } 
     } 
    } 
+0

Dahili listeyi de kopyalayamadınız mı? – Svish

+0

ahh, bana bunu –

+0

yendi gerçek hile hala devlet memuru olarak kullanamazsınız, bu durumsal olduğu gibi. Eğer 2 iş parçacığı aynı zamanda numaralandırmaya çalıştıysa, kopyalanan listeyi nerede saklarsınız? –

İlgili konular