La collection d'erreur "a été modifiée; l'opération d'énumération peut ne pas s'exécuter" surgit lorsqu'une boucle foreach
itère sur une collection modifiée lors de l'exécution de la boucle. Cela se produit souvent lors de l'ajout ou de la suppression des éléments de la collection dans la boucle elle-même, ou d'un autre thread.
L'exemple fourni montre cette erreur dans une méthode NotifySubscribers()
itérant dans un dictionnaire subscribers
. Le problème découle de la méthode SignalData
, qui pourrait indirectement modifier le dictionnaire subscribers
pendant que NotifySubscribers()
est en cours d'exécution. Cela pourrait se produire si SignalData
déclenche des ajouts ou des éliminations des abonnés.
La solution consiste à créer une copie de la collection Avant Entrer dans la boucle. Cela empêche la modification de la collection originale d'affecter l'itération de la boucle:
foreach (Subscriber s in subscribers.Values.ToList()) { // Notify subscriber s }
L'utilisation ToList()
crée une nouvelle liste contenant un instantané du subscribers.Values
. La boucle foreach
fonctionne désormais sur cette copie indépendante, garantissant que les modifications du dictionnaire d'origine subscribers
ne provoqueront pas l'erreur. Cela garantit une énumération sûre et fiable.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!