2009-12-17 4 views
21

Auf einer ausgelasteten ASP.NET-Website habe ich ein Dictionary, das als Cache fungiert und grundsätzlich Schlüssel/Wert-Paare für den späteren Abruf speichert.Wann wirft ein Wörterbuch eine IndexOutOfRangeException auf Add oder ContainsKey?

Bei hoher Auslastung wird das Dictionary manchmal in einen Zustand versetzt, in dem es immer eine IndexOutOfRangeException auslöst, wenn ich die ContainsKey- oder Add-Methode aufruft. Die Ausnahme tritt innerhalb der privaten FindEntry-Methode auf.

Ich vermute, dass dies auf ein Synchronisationsproblem zurückzuführen sein könnte, aber ich bin mir nicht sicher.

Kann mir jemand sagen, unter welchen Umständen das passieren kann? Mein Ziel ist es, genügend Informationen zu sammeln, um das Problem in der Entwicklungsumgebung reproduzieren zu können.

+0

Haben Sie die *** Equals *** -Methode übergangen, die auch intern verwendet wurde, um Objekte zu vergleichen? – serhio

Antwort

20

Die Dokumentation für Dictionary Zustände:

Für Instanzelemente sind garantiert nicht Thread-sicher werden.

Damit die Sammlung von mehreren Threads zum Lesen und Schreiben zugegriffen werden kann, müssen Sie eine eigene Synchronisierung implementieren.

Wenn Sie keinen Zugriff auf die Dictionary Synchronisation sind, dann könnten Sie Probleme wie diejenigen erhalten Sie beschreiben (vermutlich, weil der interne Zustand nicht mehr gültig ist). Wenn Sie versuchen möchten, dies in Ihrer Entwicklungsumgebung zu reproduzieren, versuchen Sie, ein Programm zu erstellen, das mehrere Threads verwendet, um kontinuierlich ohne Synchronisation von einem Dictionary zu lesen und zu schreiben.

1

Ich stimme zu, dass dies fast sicher ein Synchronisationsproblem ist.

Ich kenne keine Dokumentation, die genau beschreibt, wann und wie dies geschehen kann - das Verhalten ist undefiniert, wenn Sie ein Wörterbuch nicht threadsicher verwenden.

Zum Testen in Ihrer Entwicklungsumgebung würde ich vorschlagen, einige parallele Threads auszuführen, die zufällig in einer kontinuierlichen Schleife einfügen, entfernen, aktualisieren usw. (im Grunde eine "konzentrierte" Version dessen, was in Ihrer Produktionsumgebung passiert).

Verwandte Themen