2012-07-16 11 views
45

Bu daha akademik bir sorudur ... ancak ConcurrentDictionary.TryAdd başarısız olabilir mi? Ve eğer böyle durumlarda ve neden?Can ConcurrentDictionary.TryAdd başarısız mı?

+0

Bu soru oldukça belirsizdir. MSDN [sayfa] (http://msdn.microsoft.com/en-us/library/dd267291.aspx), birkaç istisna, istisnai ve diğer (şimdiye kadar verilmiş cevaplar gibi) belgelenmiştir. –

+9

evet ve MSDN belgeleri netliği ve kusursuzluğuyla bilinir –

+1

Peki, diğer cevaplar için yeterince açık ve kusursuz görünüyor. –

cevap

69

elinden Evet, burada koşullar (from msdn) şunlardır:

  • ArgumentNullException - anahtardır null başvuru
  • OverflowException - elemanlarının maksimum sayıda ulaşıldı zaman
  • It Aynı anahtara sahip bir öğe yanlış döndürürse

Sadece yinelemek için, bu eşzamanlılık ile ilgisi yok. Aynı anda bir öğe ekleme hakkında iki konuları kaygı varsa o zaman şu olabilir: tuşları

  • Bir insert çalışıyor ve gerçek döndüren farklı ise

    • Hem ekler, iyi çalışır, diğer ekleme başarısız (istisnasız) ve yanlış döndürür. Bu, iki iş parçacığının aynı anahtara sahip bir öğeyi eklemeyi denemesi ve temel olarak yalnızca birinin diğerini kaybetmesiyle olur.
  • +4

    Tamam ... eşzamanlı erişim ile ilgisi yok ... sadece standart bir sözlükle yapması gereken aynı kontrolleri gerçekleştiriyor. –

    +1

    Evet, dahili olarak birden çok eşzamanlı bağlantıya izin veren CPU eğirme kullanır. – oleksii

    +0

    Teşekkürler .. Cevabınızı en yapıcı olarak kabul ediyorum. Burada oldukça zor bir hatanın hatalarını ayıklıyoruz ve olası kaynakları hatlara göre belirliyoruz. Katkıda bulunduğunuzlara dayanarak TryAdd'yi ekleyebilirim (ekleyememe durumunda hala ek kayıt ekleyeceğim rağmen) –

    6

    Elbette yapabilir. Anahtar zaten varsa, yöntem yanlış döndürür.

    Ref: http://msdn.microsoft.com/en-us/library/dd267291.aspx

    Dönüş Değeri Tür: System.Boolean true anahtar/değer çifti başarıyla ConcurrentDictionary eklendi eğer. Anahtar zaten varsa, bu yöntem false değerini döndürür.

    +0

    Eh ... Bu verilen bir. Başarısız olduğu tek durum bu mu? –

    +0

    @daveL - evet, istisnalar oluştuğunda ... Oleksi'nin cevabı. –

    +0

    Yardımınız için teşekkürler ... –

    2

    Anahtar zaten sözlükte mevcut olduğunda başarısız olur.

    Bellek tükendiğiniz için değer eklenemiyorsa, bunun yerine bir istisna alırsınız.

    İlgili konular