Enumerationsvorgang konnte nicht ausgeführt werden, da Auflistung geändert - wie sperren?



  • Hallo,

    es wird aus mehreren Threads gleichzeitig auf ein Dictionary zugegriffen. Findet in einem Thread nun ein Enumerationsvorgang per foreach-Schleife auf das betreffende Dictionary statt, während in einem anderen Thread diesem ein neues Element hinzugefügt wird, führt dies ja bekanntlicherweise zu oben genannter Exception.

    Wie kann man bei einer Enumeration z.B. das Dictionary nun sperren, sodass während der Enumerationsdauer kein Schreibzugriff auf das Dictionary erfolgen kann?



  • Indem Du den Zugriff in kritischen Abschnitten synchronisierst.

    http://msdn.microsoft.com/de-de/library/c5kehkcz(v=vs.80).aspx

    Das Thema Threading ist enorm umfangreich und es ist sehr sinnvoll sich tiefer einzulesen bevor man loslegt.



  • Hallo Mü,

    danke für Deine Antwort. Deine vorgeschlagene Lösung habe ich bereits ausprobiert, diese hat das Problem jedoch nicht beheben können. Ich habe einen Lock auf die Dictionary-Instanz gesetzt, während durch diese iteriert worden ist. Während der Enumeration konnte der Auflistung dennoch ein Element hinzugefügt werden - sollte ich etwas spezielles beachten?



  • mikey schrieb:

    Während der Enumeration konnte der Auflistung dennoch ein Element hinzugefügt werden - sollte ich etwas spezielles beachten?

    Ja natürlich kann man noch darauf zugreifen. Der schreibende Codeteil muss natürlich auch mit einem lock auf das gleiche Objekt gesperrt werden.

    Man kann dabei mehr falsch als richtig machen, wenn man einfach intuitiv programmiert. Also vorsicht 😉



  • Stimmt, logisch... habe mir jetzt mal die Mühe gemacht und das in einem kleinem Testcode nachvollzogen. Wenn ich die Sperre jeweils beim Iterieren und Schreiben auf's selbe Objekt setze, funktioniert's. Danke für Deine Anregungen 😉


Anmelden zum Antworten