Je souhaite effectuer une itération en toute sécurité (ne pas modifier une collection pendant l'itération) via un tableau pouvant être modifié par un autre thread. Quelle est la meilleure façon de le faire?Itérer en toute sécurité un tableau qui peut être modifié dans un autre thread
Répondre
Que voulez-vous dire par "en toute sécurité"? Cela vous dérange-t-il de voir un mélange d'anciennes et de nouvelles valeurs? Si oui, vous pouvez simplement itérer en utilisant foreach
. (Ceci pour deux raisons: d'une part, les tableaux n'ont pas de "numéro de version" interne comme List<T>
, donc l'itérateur ne peut pas détecter que le tableau a changé, d'autre part, en utilisant foreach
sur un type connu comme un tableau dans C# oblige le compilateur à utiliser la longueur et l'indexeur de toute façon, plutôt que d'utiliser un itérateur.)
Si vous voulez obtenir un instantané, vous devez essentiellement copier le tableau et le parcourir.
EDIT: Je supposais que vous vouliez la concurrence. (Je ne sais pas pourquoi j'ai supposé cela.) Je suis d'accord avec les autres réponses que le verrouillage est une alternative - mais vous devez verrouiller toute l'itération, par ex.
lock (someLock)
{
foreach (var x in array)
{
// Stuff
}
}
et également dans le fil d'écriture: (. Vous pouvez verrouiller sur le tableau lui-même, mais je préfère généralement avoir des verrous privés)
lock (someLock)
{
array[0] = "foo";
}
Si vous 'ai un itérateur à une collection et cette collection change (sur un autre thread) l'itérateur ne lance-t-il pas? – Will
@Will: Pour la plupart des collections, oui - mais pas pour les tableaux. –
Intéressant ... Je pense que System.Array fournirait ceci juste pour que le comportement soit largement implémenté. – Will
Faire une copie? Je suppose que cela dépend si vous voulez que votre itération soit un «instantané dans le temps» ou si vous voulez voir les changements «vivre». Ce dernier peut devenir très risqué.
il y a un moyen d'itérer et obtenir des changements en direct? –
Vous voulez probablement utiliser syncronized accès. Vous pouvez verrouiller le tableau pour le temps dont vous avez besoin pour l'analyser et le temps que vous ajoutez/supprimez des éléments.
Vous pouvez utiliser le verrouillage/déverrouillage (http://msdn.microsoft.com/en-us/library/c5kehkcz(VS.80).aspx
Pour ultra safeness, vous pouvez verrouiller tous les accès au réseau pendant que vous itérez à travers elle. Son seul moyen d'assurer que le tableau que vous Itère est entièrement jusqu'à ce jour ..
Target 4.0 et utiliser l'un des nombreux thread safe collections.
- 1. Comment remplir en toute sécurité un tableau depuis un thread en le lisant dans un autre en Objective-C?
- 2. Peut-Parallel.ForEach être utilisé en toute sécurité avec CloudTableQuery
- 3. Soulever un fil d'événement en toute sécurité
- 4. Itérer à travers un tableau
- 5. Comment utiliser un obfuscateur en toute sécurité?
- 6. Comment stocker en toute sécurité un mot de passe dans un fichier?
- 7. Obtention d'événements à partir d'un thread en toute sécurité
- 8. Itérer à travers un tableau PHP et insérer un autre tableau sans l'écraser
- 9. verrouiller en toute sécurité un fichier, puis se déplacer? windows
- 10. Est le C# '??' thread de l'opérateur en toute sécurité?
- 11. Un DataBinder.Eval peut-il être imbriqué dans un autre DataBinder.Eval?
- 12. Android: Un seul Looper peut être créé par thread
- 13. Comment remplir un tableau d'octets à partir de plusieurs threads en toute sécurité?
- 14. Comment effacer en toute sécurité un fichier/répertoire en Python?
- 15. Le code TeX peut-il être exécuté en toute sécurité à partir de sources non fiables?
- 16. Comment gérez-vous un QSpinBox qui peut être modifié par l'utilisateur et le programme?
- 17. En Perl, comment créer en toute sécurité un FIFO temporaire?
- 18. Insertion d'un nœud dans un ensemble imbriqué en toute sécurité?
- 19. tableau dans un autre tableau
- 20. Combien de fichiers un répertoire Windows Server 2008 R2 peut-il contenir en toute sécurité?
- 21. Comment puis-je convertir en toute sécurité un tableau d'octets en une chaîne et revenir?
- 22. Mettre à jour un compte (champ) en toute sécurité dans SQL
- 23. Liste des branches git qui peuvent être supprimées en toute sécurité
- 24. comment créer une chaîne qui peut être utilisée comme un tableau en python?
- 25. Simplifier une boucle dans un tableau qui peut être plat ou multidimensionnel
- 26. Android: asyncTask peut-il retourner dans un autre thread que thread UI?
- 27. Comment créer un modèle d'instance qui peut être partagé à travers un composant (qui peut être créé plus d'une fois)
- 28. Récupérer en toute sécurité les valeurs d'un élément qui peut contenir des valeurs différentes
- 29. Comment CopyOnWriteArrayList peut-il être thread-safe?
- 30. Comment signer des données en toute sécurité avec un horodatage?
vous devriez commencer par définir ce que vous entendez par « toute sécurité itérer. » – jason