我有这个代码循环遍历元素的节点:
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}}放在循环中,但我担心这可能无法解决问题的根源。这应该是可能的吗?是否有可能页面中的脚本在我的循环运行的同时运行,这将是删除内部元素的脚本?或者还有什么可能导致集合的长度发生变化?
答案 0 :(得分:0)
你有一个单独的线程正在修改集合吗?或者您在检索原始枚举器后更改它?如果您这样做:
var all = node.AllElements();
node.removeChild(child);
all.moveNext();
你会遇到问题。
答案 1 :(得分:0)
数据是实时的,可以在循环中间进行垃圾收集。在循环之后对数据调用GC.KeepAlive应该允许它保持可用。