adressieren die Ausnahme "Sammlung modifiziert" in WCF
Dieser Artikel untersucht die gemeinsame "Sammlung wurde geändert; Aufzählungsoperation kann möglicherweise keine Ausnahme ausführen", die häufig bei der Arbeit mit Sammlungen in Umgebungen mit Multi-Threaded, insbesondere innerhalb von WCF-Diensten, auftritt.
Szenario und Code -Aufschlüsselung
Die Ausnahme ergibt sich, wenn eine Sammlung iteriert wird, während gleichzeitig geändert wird. Stellen Sie sich einen WCF -Dienst vor, der ein Wörterbuch verwendet, um Abonnenten zu verfolgen. Eine Methode iteriert dieses Wörterbuch, um Abonnenten zu benachrichtigen, aber ein anderer Prozess (möglicherweise innerhalb derselben Methode) verändert das Wörterbuch gleichzeitig. Dies führt zu der Ausnahme.
Ursachenanalyse
Das Problem beruht auf der gleichzeitigen Änderung des Abonnenten -Wörterbuchs während der Iteration. Wenn beispielsweise eine SignalData
-Methode, zum Beispiel, einen Abonnenten innerhalb der Iterationsschleife entfernt oder aktualisiert, ändert sich die Struktur der Sammlung und verursacht die Ausnahme.
Lösung: Erstellen Sie eine sichere Kopie
Die Lösung liegt beim Erstellen einer Kopie der Sammlung , bevor die Iteration starten. Erstellen Sie eine Kopie mit subscribers.Values
: ToList()
, anstatt direkt über das
<code class="language-csharp">foreach (Subscriber s in subscribers.Values.ToList())</code>
Dies schafft in diesem Moment einen Schnappschuss des Staates der Sammlung. Modifikationen zum ursprünglichen subscribers
Wörterbuch wirken sich nicht auf diese neue Liste aus, wodurch die Ausnahme verhindert wird.
Zusammenfassung
Die Ausnahme "Sammlung wurde modifiziert" unterstreicht die Gefahren des gleichzeitigen Zugangs und der Änderung von Sammlungen. Durch die Verwendung einer Kopie der Sammlung für die Iteration gewährleisten wir die Sicherheit von Threads und verhindern die Ausnahme, wobei die Integrität des Aufzählungsprozesses beibehalten wird.
Das obige ist der detaillierte Inhalt vonWie kann die 'Sammlung geändert' verhindern, dass die Aufzählungsoperation in WCF -Diensten keine Ausnahme ausführt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!