2011-07-22 67 views
0
HtmlHelper.GetTagsAndValues(htmlContent); 

被拋出,我得到這個錯誤:異常在C#

at System.String.Split(String[] separator, Int32 count, StringSplitOptions options) 
    at System.String.Split(String[] separator, StringSplitOptions options) 
    at WebCrawler.Logic.CrawlerManager.UseRulesOnHtmlPage(Agencies agency, String pageUrl, List`1 listTagValuePair, RulesGroups ruleGroup) in D:\PROJEKTI\crawler\WebCrawlerSuite\WebCrawler.Logic\CrawlerManager.cs:line 263 
    at WebCrawler.Logic.CrawlerManager.GetAdvertismentFromHtmlContent(List`1 listTagValuePair, Agencies agency, String pageUrl) in D:\PROJEKTI\crawler\WebCrawlerSuite\WebCrawler.Logic\CrawlerManager.cs:line 191 
    at WebCrawler.Logic.CrawlerManager.ImportAdvertisment2Database.Work(Crawler crawler, PropertyBag propertyBag) in D:\PROJEKTI\crawler\WebCrawlerSuite\WebCrawler.Logic\CrawlerManager.cs:line 668 
    at WebCrawler.Logic.CrawlerManager.ImportAdvertisment2Database.Process(Crawler crawler, PropertyBag propertyBag) in D:\PROJEKTI\crawler\WebCrawlerSuite\WebCrawler.Logic\CrawlerManager.cs:line 584 

我讀這篇文章:

http://blogs.msdn.com/b/ericlippert/archive/2009/06/08/out-of-memory-does-not-refer-to-physical-memory.aspx

我如何避免這種情況錯誤?

整個方法:

public static List<TagValuePair> GetTagsAndValues(string htmlContent) 
     { 
      List<TagValuePair> tagsValues = new List<TagValuePair>(); 
      Dictionary<string, int> tagAppearance = new Dictionary<string, int>(); 

      HtmlDocument doc = new HtmlDocument(); 

      if (htmlContent != null) 
      { 
       doc.LoadHtml(htmlContent); 

       if (doc.DocumentNode.SelectNodes("//*") == null) 
       { 
        List<TagValuePair> tempList = new List<TagValuePair>(); 
        tempList.Add(new TagValuePair("Error!", htmlContent, -1)); 
        return tempList; 
       } 

       foreach (HtmlNode tag in doc.DocumentNode.SelectNodes("//*")) 
       { 
        try 
        { 
         if (!string.IsNullOrEmpty(tag.InnerHtml.Trim())) 
         { 
          if (!tagAppearance.Keys.Contains(tag.Name)) 
          { 
           tagAppearance.Add(tag.Name, 1); 
          } 
          else 
           tagAppearance[tag.Name] = tagAppearance[tag.Name] + 1; 

          tagsValues.Add(new TagValuePair(tag.Name, tag.InnerHtml.Trim(), tagAppearance[tag.Name])); 
         } 
         else 
         { 
          // Help link: http://refactoringaspnet.blogspot.com/2010/04/using-htmlagilitypack-to-get-and-post_19.html 
          if (!string.IsNullOrEmpty(tag.GetAttributeValue("value", "").Trim())) 
          { 
           if (!tagAppearance.Keys.Contains("option value")) 
           { 
            tagAppearance.Add("option value", 1); 
           } 
           else 
            tagAppearance["option value"] = tagAppearance["option value"] + 1; 

           tagsValues.Add(new TagValuePair("option value", tag.GetAttributeValue("value", "").Trim(), tagAppearance["option value"])); 
          } 

          if (tag.NextSibling != null && !string.IsNullOrEmpty(tag.NextSibling.InnerHtml.Trim())) 
          { 
           if (!tagAppearance.Keys.Contains(tag.Name)) 
           { 
            tagAppearance.Add(tag.Name, 1); 
           } 
           else 
            tagAppearance[tag.Name] = tagAppearance[tag.Name] + 1; 

           tagsValues.Add(new TagValuePair(tag.Name, tag.NextSibling.InnerHtml.Trim(), tagAppearance[tag.Name])); 
          } 
         } 
        } 
        catch (Exception) 
        { 
         return null; 
        } 
       } 
      } 

編輯:

確切的錯誤是在這裏:

doc.LoadHtml(htmlContent); 
+1

您應該重新組織您的代碼。一個「全局」的System.Exception Catcher不是一個好主意。 刪除捕獲時,您可以看到拋出異常的確切位置。另見http://blogs.msdn.com/b/kcwalina/archive/2007/01/30/exceptionhierarchies.aspx –

+0

thx。所以你建議哪種類型的錯誤。問題是我在12小時的應用程序工作後出現此錯誤。 – senzacionale

+0

這段代碼運行的頻率如何? –

回答

3

我建議尋找一個內存分析器,以確保你沒有任何泄漏你的申請。鑑於你說它發生在應用程序工作12小時後,它似乎表明它可能是一個緩慢的泄漏,最終導致OutOfMemory異常。

有很多方法可以單位保存到會導致緩慢泄漏的引用。運行分析器將幫助您識別這些問題。它可能不是導致問題的一行代碼。這可能只是一行代碼經常向你展示破壞駱駝的稻草。

我以前使用過Redgates Ants Profiler(它有14天的免費試用版),它幫助我減少內存使用量並提高性能。我似乎最近在堵塞這個問題,但這純粹是因爲我發現它是一個非常有價值的工具。

查看一下walkthroughs和/或vidoes,看看如何查找泄漏。

+0

+1。另外,請特別留意大對象堆統計信息。這是我一直在努力的過程中OOM的主要罪魁禍首。 – SimonC

+0

我沒有取消訂閱特定的表單事件而受到刺激。當表格被關閉時,它永遠不會被清理乾淨,所以表格(以及它們引用的所有內容)都被留在了無法收集的地方。一個小小的變化,它有很大的不同。 –