Collections simultanées en C #

Je cherche un moyen d’obtenir une collection simultanée en C # ou au moins une collection prenant en charge un énumérateur simultané. À l’heure actuelle, je reçois une exception InvalidOperationException lorsque la collection sur laquelle je répète les modifications. Je pourrais simplement copier en profondeur la collection et travailler avec une copie privée, mais je me demande s’il existe peut-être une meilleure solution.

Extrait de code:

foreach (Ssortingng s in (List )callingForm.Invoke(callingForm.delegateGetKillSsortingngs)) { //do some jazz } 

–modifier–

J’ai pris la réponse, mais j’ai également constaté que je devais m’assurer que le code qui écrivait dans la collection devait également tenter d’obtenir un verrou.

  private void addKillSsortingng(Ssortingng s) { lock (killSsortingngs) { killSsortingngs.Add(s); } } 

Autre que de faire une copie en profondeur, votre meilleur pari pourrait être de verrouiller la collection:

  List theList = (List )callingForm.Invoke(callingForm.delegateGetKillSsortingngs); lock(theList.SyncRoot) { foreach(ssortingng s in theList) { // Do some Jazz } } 

Donc, je ne suis pas tout à fait sûr de ce que vous demandez, mais l’équipe des extensions parallèles a mis au sharepoints éléments qui pourraient convenir à la facture. Voir ce billet de blog en particulier, sur l’ énumération des collections parallèles . Il contient également un lien pour télécharger le CTP parallèle et vous pouvez bien sûr parcourir le rest des articles du blog pour avoir une idée de ce que le CTP est censé faire et du fonctionnement du modèle de programmation.

Si vous souhaitez utiliser les collections FCL, le locking est le seul moyen de prendre en charge les itérations / modifications à partir de plusieurs threads susceptibles de se chevaucher.

Faites attention à ce que vous utilisez comme object de locking, cependant. Utiliser SyncRoot n’est une bonne idée que si la collection elle-même est un membre privé de la classe qui l’utilise. Si la collection est protégée ou publique, un client de votre classe peut alors verrouiller lui-même votre SyncRoot, ce qui risque de provoquer une impasse dans le code de votre classe.

Si vous souhaitez consulter une bibliothèque de collections tierces, je vous recommande l’excellente bibliothèque de collections génériques C5 . Ils ont une famille de collections arborescentes qui peuvent facilement et en toute sécurité être modifiées et itérées en même temps sans locking – voir les sections 8.10 et 9.11 de leur (excellente) documentation pour plus de détails.