Amission de l'exception "Collection Modified" dans WCF
Cet article examine que la "collection commune a été modifiée; l'opération d'énumération peut ne pas exécuter" Exception, fréquemment rencontrée lorsque vous travaillez avec des collections dans des environnements multithreads, en particulier dans les services WCF.
Scénario et panne de code
L'exception se produit lorsqu'une collection est itérée tout en étant modifiée simultanément. Imaginez un service WCF utilisant un dictionnaire pour suivre les abonnés. Une méthode itère dans ce dictionnaire pour informer les abonnés, mais un autre processus (peut-être dans la même méthode) modifie simultanément le dictionnaire. Cela conduit à l'exception.
Analyse des causes racines
Le problème découle de la modification simultanée du dictionnaire d'abonné pendant l'itération. Si une méthode SignalData
, par exemple, supprime ou met à jour un abonné dans la boucle d'itération, la structure de la collection change, provoquant l'exception.
Solution: créez une copie sûre
La solution réside dans la création d'une copie de la collection avant Démarrage de l'itération. Au lieu d'itréter directement le subscribers.Values
, créez une copie en utilisant ToList()
:
<code class="language-csharp">foreach (Subscriber s in subscribers.Values.ToList())</code>
Cela crée un instantané de l'état de la collection à ce moment. Les modifications du dictionnaire d'origine subscribers
n'affecteront pas cette nouvelle liste, empêchant l'exception.
Résumé
L'exception "Collection a été modifiée" met en évidence les dangers de l'accès et de la modification simultanés des collections. En utilisant une copie de la collection pour itération, nous assurons la sécurité des filetages et empêchons l'exception, en maintenant l'intégrité du processus d'énumération.
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!