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时,它就会中断,并注意到当它停止时(因此item
是null
),我的length
变量为815,collection.length
为814,i
为814,因此它试图在范围之外获得一个项目。
我知道我可能会把collection.length
在循环中,但我担心这可能无法解决问题的根源。这是可能的吗?是否有可能在页面中的脚本运行在同一时间,我的循环正在运行,这将是脚本,正在删除一个元素里面?或者还有什么原因会导致集合的长度发生变化?
是否有一个单独的线程正在修改集合?还是在检索原始枚举数后更改它?如果你这样做:
var all = node.AllElements();
node.removeChild(child);
all.moveNext();
你会遇到问题的
数据是实时的,可以在循环中间进行垃圾收集。调用GC。在循环之后的数据的KeepAlive应该允许它保持可用。