0

要素のノードをループする次のコードがあります。

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

私の問題は、ループ中にコレクションの長さが変わることがあるということです。yield return item;nullの場合は常にブレークするブレークポイントを設定しitem、それが停止したとき(したがって、itemだったときnull)、length変数が815、814、 collection.lengthおよびi814であったため、範囲外のアイテムを取得しようとしていたことに気付きました。

おそらくループの中に入れることができると思いcollection.lengthますが、これでは問題の根本を解決できない可能性があります。これは可能でしょうか?ページ内のスクリプトがループの実行と同時に実行される可能性はありますか?それは内部の要素を削除するスクリプトになりますか?または、他に何が原因でコレクションの長さが変更されている可能性がありますか?

4

2 に答える 2

0

データはライブであり、ループの途中でガベージ コレクションされる可能性があります。ループ後にデータに対して GC.KeepAlive を呼び出すと、データを引き続き使用できるようになります。

于 2015-08-19T04:48:52.490 に答える
0

コレクションを変更している別のスレッドはありますか? それとも、元の列挙子を取得した後に変更していますか? 次のようなことをすると:

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

問題が発生します。

于 2013-02-26T17:38:18.337 に答える