抓取一个网页,其中包含大约250个分区。 使用WatiN和WatinCSSSelectors
首先,我选择属性为'width = 90%'的所有td标签:
var allMainTDs = browser.CssSelectAll("td[width=\"90%\"]");
然后我创建一个foreach循环,将var的内容粘贴到List中。 int用于检查循环当前所处的td标记。
List<Element> eletd = new List<Element>();
int i = 0;
foreach (Element td in allMainTDs)
{
eletd.Add(td);
i++;
Console.WriteLine(i);
}
它很快就达到了第250个标签。但是大约需要6分钟(使用StopWatch对象计时)才能进入下一个语句。这里发生了什么?
答案 0 :(得分:3)
你可以试试这个:
var eletd = new List<Element>(allMainTDs);
答案 1 :(得分:1)
如果您在.net 4.0下并且执行环境允许并行,那么您可能应该尝试
Prallel.ForEach(..);
答案 2 :(得分:1)
foreach
循环大致相当于以下代码(不完全相同,但足够接近):
IEnumerator<T> enumerator = enumerable.GetEnumerator();
try
{
while (enumerator.MoveNext())
{
T element = enumerator.Current;
// here goes the body of the loop
}
}
finally
{
IDisposable disposable = enumerator as System.IDisposable;
if (disposable != null) disposable.Dispose();
}
您描述的行为指向此代码的清理部分。 CssSelectAll
调用结果的枚举器可能有一个重的Dispose方法。您可以通过用上面的代码替换循环来确认这一点,并省略finally块,或者设置断点以确认Dispose
需要永远运行。