2009-12-17 11 views
21

Meşgul bir ASP .NET web sitesinde, daha sonra erişim için temel olarak anahtar/değer çiftlerini saklayan bir önbellek gibi davranan bir Sözlüküm var.Sözlük, Add veya ContainsKey üzerinde bir IndexOutOfRangeException öğesini ne zaman atar?

Yüksek yükte, Sözlük bazı durumlarda her zaman bir ConversionKey veya Add yöntemini çağırdığımda IndexOutOfRangeException atar. Özel durum özel FindEntry yönteminin içinde olur.

Bunun bir senkronizasyon sorunu nedeniyle olabileceğinden şüpheleniyorum, ancak emin değilim.

Bu durumun hangi koşullar altında olduğunu söyleyen var mı? Amacım, sorunu dev ortamda yeniden oluşturabilmem için yeterli bilgiyi toplamaktır.

+0

*** Equals *** yöntemini geçersiz kıldınız, aynı zamanda nesneleri karşılaştırmak için dahili olarak da kullanılıyor mu? – serhio

cevap

20

dokümantasyon Dictionary için devletler:

Herhangi bir örnek üyenin iş parçacığı açısından güvenliği garanti edilemez.

Koleksiyona, okuma ve yazma için çok sayıda iş parçacığı tarafından erişilmesine izin vermek için, kendi eşitlemenizi uygulamanız gerekir. Eğer Dictionary erişimi senkronize değilseniz

, o zaman (iç devlet artık geçerli değil çünkü tahminen) açıkladığınız bu gibi sorunları alabilirsiniz. Bunu geliştirme ortamınızda denemek ve çoğaltmak istiyorsanız, eşitleme yapmadan Dictionary sürekli okuma ve yazma için birden çok iş parçacığı kullanan bir program oluşturmayı deneyin.

1

Bunun neredeyse bir senkronizasyon sorunu olduğunu kabul ediyorum.

Bunun ne zaman ve nasıl yapılacağını anlatan herhangi bir belgenin farkında değilim - sözlüğü olmayan bir şekilde bir sözlüğü kullanıyorsanız, davranış tanımsızdır.

Yerel ortamınızda test yapmak için, sürekli bir döngüde rastgele ekleme, çıkarma, güncelleme vb. Bazı paralel konuları çalıştırmayı öneririm (temel olarak üretim ortamınızda olup bitenlerin "konsantre" bir sürümü).

İlgili konular