Question

Je suis à la recherche d'un moyen d'obtenir une collecte simultanée en C# ou au moins une collection qui prend en charge un concurrent à l'agent recenseur.Droit maintenant, je suis pas une exception InvalidOperationException quand la collection sur laquelle je suis itération changements.Je pourrais juste copie en profondeur de la collecte et de travailler avec une copie privée mais je me demandais si il n'y a peut-être une meilleure façon

Extrait de Code:

foreach (String s in (List<String> )callingForm.Invoke(callingForm.delegateGetKillStrings))
    {
        //do some jazz
    }

--edit--

J'ai pris la réponse, mais est aussi constaté que j'avais besoin pour s'assurer que le code qui a été écrit à la collecte nécessaire pour tenter d'obtenir un verrouillage.

    private void addKillString(String s)
    {
        lock (killStrings)
        {
            killStrings.Add(s);
        }
    }
Était-ce utile?

La solution

Autre que de faire une copie en profondeur votre meilleur pari serait de verrouillage de la collection:

   List<string> theList = (List<String> )callingForm.Invoke(callingForm.delegateGetKillStrings);
    lock(theList.SyncRoot) {
        foreach(string s in theList) {
               // Do some Jazz
        }
    }

Autres conseils

Donc je ne suis pas tout à fait sûr de ce que vous demandez, mais le Parallèle Extensions équipe a rassemblé quelques trucs qui pourraient faire l'affaire.Consultez cet article de blog en particulier, sur l'énumération des collections parallèles.Il contient également un lien pour télécharger le Parallèle CTP, et bien sûr, vous pouvez naviguer sur le reste des messages de blog pour avoir une idée de ce que le CTP est censés faire, et comment le modèle de programmation de travaux.

Si vous souhaitez utiliser le FCL collections, puis le verrouillage est la seule façon de prendre en charge l'itération et / ou de modification à partir de plusieurs threads qui peuvent se chevaucher.

Faire attention à ce que vous utilisez comme votre verrou de l'objet, si.À l'aide de SyncRoot est seulement une bonne idée si la collection elle-même est un membre privé de la classe qui l'utilise.Si la collection est protégé ou public, puis un client de votre classe peut prendre son propre cadenas sur votre SyncRoot, potentiellement interblocage avec le code dans votre classe.

Si vous êtes intéressé à prendre un coup d'oeil à un de la 3e partie de la collection de la bibliothèque, je vous conseille l'excellent C5 Générique De La Collection De La Bibliothèque.Ils ont une famille, des arbres, des collections qui peut facilement et en toute sécurité être modifié et réitéré dans le même temps, sans verrouillage - voir les sections 8.10 et 9.11 de leur (excellent) documentation pour plus de détails.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top