C# IHTMlementCollection&xB4;在循环过程中s的长度会发生变化

C# IHTMlementCollection&xB4;在循环过程中s的长度会发生变化,c#,browser,mshtml,C#,Browser,Mshtml,我有一段代码,它在元素的节点上循环: public static IEnumerable<IHTMLDOMNode> AllElements(this IHTMLDOMNode node) { if (node.IsHTMLElement()) { IHTMLElement element = (IHTMLElement)node; IHTMLElementCollection collection = element.all;

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

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;
        }
    }
}
公共静态IEnumerable等位基因(此IHTMLDOMNode)
{
if(node.ishtmlement())
{
IHTMlement元素=(IHTMlement)节点;
IHTMLElementCollection集合=element.all;
int length=collection.length;
对于(变量i=0;i
我的问题是,有时,集合的长度会在循环过程中发生变化。我在
收益返回项上设置了一个断点
为空时,代码>将中断,并注意到当它停止时(因此
),我的
长度
变量为815,
集合。长度
为814,
为814,因此它试图获取超出范围的项


我知道我可能会将
collection.length
放入循环中,但我担心这可能无法解决问题的根源。这有可能吗?页面中的脚本是否可能在“我的循环”运行的同时运行,而该脚本将删除其中的元素?或者还有什么可能导致集合的长度发生更改?

是否有单独的线程正在修改集合?或者在检索原始枚举数后是否要更改它?如果您这样做:

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

你会遇到问题。

< P>数据是实况,并且可以在循环中间被垃圾收集。在循环后对数据调用GC.KeepAlive应该允许它保持可用。

没有单独的线程。这是一个单线程应用程序。