2013-02-26 3 views
0

I ont ce code qui passe en boucle sur les nœuds d'un élément:changements de longueur IHTMLElementCollection's pendant la boucle

public static IEnumerable<IHTMLDOMNode> AllElements(this IHTMLDOMNode node) 
{ 
    if (node.IsHTMLElement()) 
    { 
     IHTMLElement element = (IHTMLElement)node; 
     IHTMLElementCollection collection = element.all; 
     int length = collection.length; 
     for (var i = 0; i < length; i++) 
     { 
      IHTMLDOMNode item = collection.item(i); 
      yield return item; 
     } 
    } 
} 

Mon problème est que parfois, la longueur de la collection changera au cours de la mise en boucle. Je mis un point d'arrêt à yield return item; qui briserait chaque fois item est nulle, et remarqué quand il a cessé (et donc item était null) que ma variable length était 815, collection.length était 814 et i était 814 il essayait d'obtenir un article en dehors de la gamme.

Je sais que je pourrais probablement mettre collection.length à l'intérieur de la boucle mais j'ai peur que cela ne résolve pas la racine du problème. Est-ce censé être possible? Est-il possible qu'un script de la page s'exécute en même temps que ma boucle qui serait le script qui supprime un élément à l'intérieur? Ou quoi d'autre pourrait faire changer la longueur de la collection?

Répondre

0

Avez-vous un thread séparé qui modifie la collection? Ou le changez-vous après avoir récupéré l'énumérateur original? Si vous faites quelque chose comme ceci:

var all = node.AllElements(); 
node.removeChild(child); 
all.moveNext(); 

Vous rencontrerez des problèmes.

+0

Il n'y a pas de thread séparé. Ceci est une application à un seul thread. – Juan

0

Les données sont en ligne et peuvent être récupérées dans le milieu de la boucle. Appelant GC.KeepAlive sur les données après la boucle devrait lui permettre de rester disponible.

Questions connexes