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;每当item它为空时就会中断,并注意到当它停止时(因此itemnull)我的length变量是 collection.length815、814 和i814,因此它试图获取范围之外的项目。

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

4

2 回答 2

0

您是否有一个单独的线程正在修改集合?还是在检索原始枚举数后更改它?如果你做这样的事情:

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

你会遇到问题。

于 2013-02-26T17:38:18.337 回答
0

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

于 2015-08-19T04:48:52.490 回答