Maison >développement back-end >C++ >Comment empêcher la modification de la 'collection a été modifiée; l'opération d'énumération peut ne pas exécuter' Exception 'dans les services WCF?

Comment empêcher la modification de la 'collection a été modifiée; l'opération d'énumération peut ne pas exécuter' Exception 'dans les services WCF?

Linda Hamilton
Linda Hamiltonoriginal
2025-02-02 03:36:08772parcourir

How to Prevent the

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn