2009-10-18 2 views
0

Juste pour vous assurer, dire que j'ai ce code:recenseurs et Réentrance

this.allObjects = [some linq query]; 

et ont deux méthodes à la fois en lecture (modifier) ​​ce IEnumerable, sont-ils sûrs d'appeler en parallèle? Juste en boucle à travers un IEnumerable devrait être sûr à droite?

Répondre

1

Cela dépend de la mise en œuvre de l'énumérateur, mais dans la plupart des cas, oui, il est sûr. Une note cependant: le pseudo-code, comme vous l'avez, ne fait réellement rien (en raison de l'exécution différée). La requête LINQ s'exécutera uniquement lorsque vous accéderez à allObjects (ou si vous appelez quelque chose comme ToList() dans la requête LINQ).

+0

Oui, mais c'est bon non? Lorsque j'accède à la requête linq en la parcourant par exemple, il va lancer GetEnumerator et générer une nouvelle IEnumerable ... en boucle sur le même IEunumerable pourrait être pire .. – Homde

+0

Corriger. La seule heure où la concurrence est un problème est si l'iteration effectue des modifications (ce qui n'est pas ce à quoi tout le monde s'attendrait, mais est possible) - mais cela n'arrive jamais avec les collections standard. –

0

Les instances IEnumerable<T> sont probablement correctes (bien que cela dépende de l'implémentation).

IEnumerator<T> cas sont probablement pas bien (bien qu'encore une fois: les détails de mise en œuvre).

Questions connexes