Collection was modified; enumeration operation may not execute

  • C#
  • .NET (FX) 4.0

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    Collection was modified; enumeration operation may not execute

    Hallo zusammen,

    ich habe ein Projekt in C# mit einer Windows Forms-Steuerelementbibliothek. In diesem Control soll, wenn ein Trigger kommt, eine Serie in einem Chart dargestellt werden.
    Die Werte der Punkte für die Serie stehen in einem Array zur Verfügung und ich habe auf die folgenden zwei Möglichkeiten versucht, sie als Punkte der Serie hinzuzufügen:

    1)

    C#-Quellcode

    1. for (int j = 1; j <= 255; j++)
    2. {
    3. //Punkt nur hinzufügen, wenn es kein Defaultwert ist
    4. if (Convert.ToInt32(ArrIstkurve[j]) != -1)
    5. {
    6. Ist_serie_spline.Points.AddXY(Convert.ToDouble(ArrIstkurve[j]), j);
    7. }
    8. }


    2)

    C#-Quellcode

    1. Ist_serie_spline.Points.DataBindXY(ListX, ListY);


    Falls der Trigger ein zweites Mal kommt, leere ich die Serie mit Clear() und füge die dann aktuellen Punkte wieder hinzu.
    Manchmal funktioniert es und manchmal kommt die Meldung "Collection was modified; enumeration operation may not execute".

    Anscheinend habe ich somit also eine nicht ganz saubere Methode gewählt und greife auf etwas zu, dass zu diesem Zeitpunkt nicht existiert bzw lösche etwas, auf das dann zugegriffen werden soll...

    Hat jemand einen Hinweis wieso das so nicht funktioniert?

    Mulas94 schrieb:

    Falls der Trigger ein zweites Mal kommt
    Wie dicht kommen die Trigger?
    Bei welcher Deiner Varianten kommt die Exception?
    Kann es sein, dass der zweite kommt, während die Abarbeitung des ersten noch nicht zu Ende ist?
    In diesem Fall hilft ein lock() docs.microsoft.com/de-de/dotne…e/keywords/lock-statement
    Spoiler anzeigen

    C#-Quellcode

    1. private object thisLock = new object();

    C#-Quellcode

    1. lock(thisLock)
    2. {
    3. for (int j = 1; j <= 255; j++)
    4. {
    5. // ...
    6. }
    7. }
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany
    Danke für deine Hilfe! Die Idee mit der lock-Anweisung hat leider nicht funktioniert.

    Ich habe mir anhand einer TextBox anzeigen lassen, ob der Trigger mehrmals kommt, aber dies ist nicht der Fall.

    Die Exception wird sowohl beim einzelnen Hinzufügen von Punkten (Möglichkeit 1), als auch bei der Nutzung von DataBindXY (Möglichkeit 2) geworfen.

    Wenn ich allerdings in einer TextBox anzeige, welcher Punkt gerade hinzugefügt wird, dann "funktioniert" es. Natürlich wird der Graph dann langsamer aufgebaut und mein Problem ist damit nicht gelöst...
    Bedeutet das, dass ich ein Timing-Problem habe?

    Hier nochmal der Code:

    C#-Quellcode

    1. //Wenn Trigger kommt...
    2. if (arrTagNames[0] == m_TriggerInterpolCurve)
    3. {
    4. //Setze Trigger auf false
    5. this.TagService.WriteTag(m_RegisterCookie, m_TriggerInterpolCurve, false);
    6. clearPolkurve();
    7. ReadArrPolkurve();
    8. showPolkurve();
    9. }
    10. public void showPolkurve()
    11. {
    12. for (int j = 1; j <= 254; j++)
    13. {
    14. //Punkt nur hinzufügen, wenn es kein Defaultwert ist
    15. if (Convert.ToInt32(ArrPolkurve[j]) != -1)
    16. {
    17. Pol_serie_spline.Points.AddXY(ArrPolkurve[j], j);
    18. textBox1.Text = ArrPolkurve[j].ToString();
    19. }
    20. }
    21. }
    22. public void clearPolkurve()
    23. {
    24. Pol_serie_spline.Points.Clear();
    25. }
    @Mulas94 Kannst Du mal ein kleines Demo-Projekt machen (mit selbst generierten Daten) das Deinen Effekt reproduziert?
    Wenn ja, hänge es ohni Binaries als ZIP an.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Was würde passieren, wenn Du statt mit DataBindXY mit AddXY arbeitest? Dadurch wird eben immer nur 1 Punkt der Chart-Serie (?) hinzugefügt, anstatt ein DataBinding durchzuführen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.