2009-11-25 8 views

Répondre

4

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"; 
} 

+0

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

+0

@Will: Pour la plupart des collections, oui - mais pas pour les tableaux. –

+0

Intéressant ... Je pense que System.Array fournirait ceci juste pour que le comportement soit largement implémenté. – Will

4

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é.

+0

il y a un moyen d'itérer et obtenir des changements en direct? –

0

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

0

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 ..

Questions connexes