IHTMLElementCollection´s的长度在循环期间改变

本文关键字:循环 改变 #180 IHTMLElementCollection | 更新日期: 2023-09-27 18:01:27

我有这样一段代码,它在元素的节点上循环:

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为null时,它就会中断,并注意到当它停止时(因此itemnull),我的length变量为815,collection.length为814,i为814,因此它试图在范围之外获得一个项目。

我知道我可能会把collection.length在循环中,但我担心这可能无法解决问题的根源。这是可能的吗?是否有可能在页面中的脚本运行在同一时间,我的循环正在运行,这将是脚本,正在删除一个元素里面?或者还有什么原因会导致集合的长度发生变化?

IHTMLElementCollection´s的长度在循环期间改变

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

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

你会遇到问题的

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