类型'的例外情况;System.OutOfMemoryException';被扔进C#

类型'的例外情况;System.OutOfMemoryException';被扔进C#,c#,out-of-memory,C#,Out Of Memory,我得到了这个错误: HtmlHelper.GetTagsAndValues(htmlContent); 我读了这篇文章: 如何防止此错误 整体方法: at System.String.Split(String[] separator, Int32 count, StringSplitOptions options) at System.String.Split(String[] separator, StringSplitOptions options) at WebCrawl

我得到了这个错误:

HtmlHelper.GetTagsAndValues(htmlContent);
我读了这篇文章:

如何防止此错误

整体方法:

 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

我建议您查看内存分析器,以确保应用程序中没有任何泄漏。如果你说它发生在应用程序运行12小时之后,那么这似乎表明它可能是一个缓慢的泄漏,最终导致OutOfMemory异常

有很多方法可以让你保持引用的一致性,这会导致缓慢的泄漏。运行探查器将帮助您识别这些问题。可能不是一行代码导致了问题。这可能只是因为一行代码经常会让你看到让骆驼倒下的稻草

我以前用过(它有14天的免费试用期),它帮助我降低了内存使用率并提高了性能。我最近似乎经常使用它,但这纯粹是因为我发现它是一个非常有价值的工具


查看他们的一些产品和/或了解如何追踪泄漏

我建议查看内存分析器,以确保应用程序中没有任何泄漏。如果你说它发生在应用程序运行12小时之后,那么这似乎表明它可能是一个缓慢的泄漏,最终导致OutOfMemory异常

有很多方法可以让你保持引用的一致性,这会导致缓慢的泄漏。运行探查器将帮助您识别这些问题。可能不是一行代码导致了问题。这可能只是因为一行代码经常会让你看到让骆驼倒下的稻草

我以前用过(它有14天的免费试用期),它帮助我降低了内存使用率并提高了性能。我最近似乎经常使用它,但这纯粹是因为我发现它是一个非常有价值的工具


查看他们的一些产品和/或了解如何追踪泄漏

你应该重新组织你的代码。“全局”系统。异常捕获器不是一个好主意。移除捕获时,您可以看到异常抛出的确切位置。另见thx。那么你建议哪种类型的错误呢。问题是,我在应用程序运行12小时后出现此错误。此代码多久运行一次?取决于读取html的速度。不到20秒,您就可以运行此程序,直到它获得异常,然后连接visual studio调试器以查看异常发生的位置。您还可以监视内存是否已满。也许你有一些内存泄漏?你应该重新组织你的代码。“全局”系统。异常捕获器不是一个好主意。移除捕获时,您可以看到异常抛出的确切位置。另见thx。那么你建议哪种类型的错误呢。问题是,我在应用程序运行12小时后出现此错误。此代码多久运行一次?取决于读取html的速度。不到20秒,您就可以运行此程序,直到它获得异常,然后连接visual studio调试器以查看异常发生的位置。您还可以监视内存是否已满。也许你有一些内存泄漏?+1用于Ants分析器。另外,请特别注意大型对象堆统计信息。这是我一直在做的OOMs的罪魁祸首。我因为没有取消订阅某个特定的表单事件而被刺痛。当表单关闭时,它从未被清理,因此表单(以及它们引用的所有内容)被挂起,无法收集。一个小的变化,它作出了重大的变化。+1的蚂蚁剖析。另外,请特别注意大型对象堆统计信息。这是我一直在做的OOMs的罪魁祸首。我因为没有取消订阅某个特定的表单事件而被刺痛。当表单关闭时,它从未被清理,因此表单(以及它们引用的所有内容)被挂起,无法收集。一个小小的改变,它产生了重大的变化。
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);