Seltsam, "die Auflistung wurde geändert, nachdem der enumerator instanziiert wurde" Ausnahme
Vielleicht jemand kann mich in die richtige Richtung, da bin ich völlig überfragt.
Ich habe eine Funktion, die einfach druckt eine LinkedList Klassen:
LinkedList<Component> components = new LinkedList<Component>();
...
private void PrintComponentList()
{
Console.WriteLine("---Component List: " + components.Count + " entries---");
foreach (Component c in components)
{
Console.WriteLine(c);
}
Console.WriteLine("------");
}
Den Component
Objekt tatsächlich hat Sie eine benutzerdefinierte ToString()
nennen als solche:
int Id;
...
public override String ToString()
{
return GetType() + ": " + Id;
}
Diese Funktion in der Regel gut funktioniert - aber ich habe, laufen in das Problem, dass, wenn es baut auf über 30 oder so Einträge in der Liste, die PrintcomplentList
foreach
Aussage kommt zurück mit einer InvalidOperationException: Collection was modified after the enumerator was instantiated.
Nun, wie Sie sehen können, dass ich mich nicht ändern Sie den code innerhalb der for-Schleife, und ich habe nicht explizit erstellt threads, obwohl dies innerhalb eines XNA-Umgebung (falls es darauf ankommt). Es sollte angemerkt werden, dass der Ausdruck ist Häufig genug, dass die Ausgabe in der Konsole verlangsamt das Programm als ganzes.
Ich bin völlig ratlos, hat jemand dort draussen in dieser?
Ich werde sehen, was ich tun kann.
Ich cna nicht bekommen ein kleines Programm zu replizieren, die Verhalten, so werde ich sehen, darum ein thread-sichere Implementierung der LinkedList in dort zu sehen, ob es fängt alles
InformationsquelleAutor cyberconte | 2009-05-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich vermute, dass der Ort zu Beginn der Suche wird an jedem Orte, wo Sie manipulieren die Liste - d.h. insert/remove/re-Positionen zuordnen. Mein Verdacht ist, dass es eine Rückruf - /selbst-handler das ist irgendwo gefeuert asynchron (vielleicht als Teil des XNA Farbe etc Schleifen), und die Bearbeitung der Liste - im wesentlichen verursacht dieses problem, da eine race-Bedingung.
Überprüfen, ob dies der Fall ist, setzen einige debug - /trace-Ausgabe rund um die Orte zu manipulieren, dass die Liste, und sehen, ob es überhaupt (und insbesondere kurz vor die Ausnahme ist) läuft die manipulation von code zur gleichen Zeit wie Ihr die Ausgabe der Konsole:
Leider, solche Dinge sind oft schwer zu Debuggen, da sich der code, es zu untersuchen, ändert sich oft das problem (ein Heisenbug).
Einer Antwort wäre zu synchronisieren, Zugang, d.h. in alle die Orte, die die Liste Bearbeiten, verwenden Sie eine
lock
um den kompletten Betrieb:und in deinem callback (oder was auch immer)
Insbesondere eine "komplette" zählen könnte:
foreach
/for
(also nicht die einzelne/diskrete Operationen - aber Arbeitseinheiten)
InformationsquelleAutor Marc Gravell
Statt
foreach
verwende ichwhile( collection.count >0)
dann verwendencollection[i]
.InformationsquelleAutor arash
Ich weiß nicht, ob dies relevant ist für die OP, aber ich hatte den gleichen Fehler und fand diesen thread bei einer google-Suche. Ich war in der Lage, es zu lösen, indem Sie hinzufügen einer Pause nach dem entfernen Sie ein element in der Schleife.
Wenn man die Pause machen, werden Sie die Fehlermeldung erhalten: "InvalidOperationException: die Auflistung wurde geändert, nachdem der enumerator instanziiert wurde."
InformationsquelleAutor Steffan
Mit
Break
ein Weg sein könnte, aber es kann Auswirkungen auf eine Reihe von der operation.Was ich in diesem Fall einfach konvertieren Sie die
foreach
traditionellenfor
SchleifeDieses funktioniert ohne Probleme.
InformationsquelleAutor Saikat Chakraborty