循环期间IHTMLElementCollection的长度发生了变化

时间:2013-02-26 17:15:36

标签: c# browser mshtml

我有这个代码循环遍历元素的节点:

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;处设置了一个断点,该断点会在item为空时中断,并且当它停止时(因此item null} length}我的collection.length变量时会注意到这个断点是815,i是814,collection.length是814所以它试图让一个项目超出范围。

我知道我可能会把{{1}}放在循环中,但我担心这可能无法解决问题的根源。这应该是可能的吗?是否有可能页面中的脚本在我的循环运行的同时运行,这将是删除内部元素的脚本?或者还有什么可能导致集合的长度发生变化?

2 个答案:

答案 0 :(得分:0)

你有一个单独的线程正在修改集合吗?或者您在检索原始枚举器后更改它?如果您这样做:

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

你会遇到问题。

答案 1 :(得分:0)

数据是实时的,可以在循环中间进行垃圾收集。在循环之后对数据调用GC.KeepAlive应该允许它保持可用。