Foreach循环需要很长时间才能突破

时间:2011-02-02 16:21:39

标签: c# foreach watin enumeration

抓取一个网页,其中包含大约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对象计时)才能进入下一个语句。这里发生了什么?

3 个答案:

答案 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需要永远运行。