2012-04-02 15 views
0

Ich erhalte eine System.IndexOutOfRangeException auf List.Find(). Das Problem ist, dass es nicht konsistent ist und nur in der Produktionsumgebung passiert. Gehen Sie durch die MSDN-Dokumentation für die List.Find(Predicate match) method, aber es heißt über Index außerhalb des Bereichs Ausnahme. In welchem ​​Szenario würde System.IndexOutOfRangeException von der List.Find() -Methode ausgelöst werden?Liste <T> .Find werfen System.IndexOutOfRangeException

Dies geschieht in einer ASP.Net-Anwendungen. Der Code ist in einer statischen Methode in etwa so:

private static T GetReflectionInfo<T>(object obj, string memberName) where T : System.Reflection.MemberInfo 
{ 
    var knownInfos = new List<MemberInfo>(); 
    /// populate the list 
    /// this line is where the exception is thrown. T is the generic type passed in. 
    T info = (T) knownInfos.Find(item => item is T && item.Name.EqualsIgnoreCase(memberName)); 
} 

[Update] - das Problem etwas falsch mit einem der Knoten entpuppte. Danke für deine Antworten und Kommentare.

+7

Zeigen Sie uns Ihren Code. –

+1

Wie wird diese Liste beibehalten? In einer Web-Umgebung benötigen freigegebene Ressourcen eine spezielle Handhabung. – leppie

+0

Verwenden Sie dies in einer Multithread-Anwendung? – JaredPar

Antwort

6

Es könnte ausgelöst werden, wenn Sie die List (speziell Entfernen von Elementen) aus einem anderen Thread ändern, während die Suche ausgeführt wird. Wie pro the documentation, das nicht erlaubt (Hervorhebung von mir):

Thema Sicherheit

öffentlichen statischen (Shared in Visual Basic) Member dieses Typs sind threadsicher. Alle Instanzmitglieder sind nicht garantiert Thread sicher.

A List (Of T) können mehrere Leser gleichzeitig, unterstützen, solange die Sammlung nicht modifiziert wird. Das Aufzählen durch eine Sammlung ist an sich keine thread-sichere Prozedur. In dem seltenen Fall, in dem eine Enumeration mit einem oder mehreren Schreibzugriffen konkurriert, ist der einzige Weg zu Thread-Sicherheit sicherzustellen, die Sammlung während der gesamten Enumeration zu sperren. Damit die Sammlung von mehreren Threads zum Lesen und Schreiben zugegriffen werden kann, müssen Sie Ihre eigene Synchronisation implementieren.

+0

+1: Das gleiche wie mein Kommentar :) – leppie

Verwandte Themen