Параллельно для каждого исключения переполнения стека

У меня есть простой код для синтаксического анализа HTMLс HtmlAgilityPackи загружать результаты SQL data server. Дело в том, что когда я использую foreachцикл, он работает правильно. Я хотел попробовать Parell for eachпетлю. Я видел, что скребок идет быстрее, но я получаю исключение переполнения стека (не каждый раз). Можете ли вы посмотреть на код и рассказать мне, почему?

 //for each link object
 Parallel.ForEach(link, _link =>
    {
    pageNumber=0;
    position=1;
    //try to load every single page number
        while (true)
        {
            //load page's html
            siteHtml = web.Load(_link.LinkUrl + "?page=" + pageNumber);
            try
            {
                doc.LoadHtml(siteHtml.DocumentNode.SelectNodes("//section[@class='answers']")[0].InnerHtml);
                comments = doc.DocumentNode.SelectNodes("//singleAnswer");
                foreach (HtmlNode _comments in comments)
                {
                    HtmlAgilityPack.HtmlDocument HtmlPage2 = new HtmlAgilityPack.HtmlDocument();
                    HtmlPage2.LoadHtml(_comments.InnerHtml)

                    commentId = Convert.ToInt32(_comments.GetAttributeValue("id", ""));
                    commentValue = (HtmlPage2.DocumentNode.SelectNodes("//p[@class='content']")[0].InnerText);

                    if (commentValue.Contains(_link.Keyword))
                    {
                        sql.updateComment(_link.LinkId, commentValue);
                        _link.Position = position;
                        _link.MyCommentId = commentId;
                        goto NextLink;
                    }
                    position++;
                }
            }

            catch
            {

            }

            if (!siteHtml.DocumentNode.InnerHtml.Contains(@"class=""pagingx"" rel=""nextPage"">"))
            {
                break;
            }

        pageNumber++;
        }

        NextLink:;
        groupBox1.Invoke(new Action(delegate ()
        {
            groupBox1.Text = "Link's statistics (" + finished + "/" + linksUrlElements + ")";
        }));
    });

Я также видел, что использование ЦП намного выше, чем Parallel for eachвместоfor each

c#,parallel-processing,stack-overflow,html-agility-pack,

0

Ответов: 0

Параллельно для каждого исключения переполнения стека

У меня есть простой код для синтаксического анализа HTMLс HtmlAgilityPackи загружать результаты SQL data server. Дело в том, что когда я использую foreachцикл, он работает правильно. Я хотел попробовать Parell for eachпетлю. Я видел, что скребок идет быстрее, но я получаю исключение переполнения стека (не каждый раз). Можете ли вы посмотреть на код и рассказать мне, почему?

 //for each link object
 Parallel.ForEach(link, _link =>
    {
    pageNumber=0;
    position=1;
    //try to load every single page number
        while (true)
        {
            //load page's html
            siteHtml = web.Load(_link.LinkUrl + "?page=" + pageNumber);
            try
            {
                doc.LoadHtml(siteHtml.DocumentNode.SelectNodes("//section[@class='answers']")[0].InnerHtml);
                comments = doc.DocumentNode.SelectNodes("//singleAnswer");
                foreach (HtmlNode _comments in comments)
                {
                    HtmlAgilityPack.HtmlDocument HtmlPage2 = new HtmlAgilityPack.HtmlDocument();
                    HtmlPage2.LoadHtml(_comments.InnerHtml)

                    commentId = Convert.ToInt32(_comments.GetAttributeValue("id", ""));
                    commentValue = (HtmlPage2.DocumentNode.SelectNodes("//p[@class='content']")[0].InnerText);

                    if (commentValue.Contains(_link.Keyword))
                    {
                        sql.updateComment(_link.LinkId, commentValue);
                        _link.Position = position;
                        _link.MyCommentId = commentId;
                        goto NextLink;
                    }
                    position++;
                }
            }

            catch
            {

            }

            if (!siteHtml.DocumentNode.InnerHtml.Contains(@"class=""pagingx"" rel=""nextPage"">"))
            {
                break;
            }

        pageNumber++;
        }

        NextLink:;
        groupBox1.Invoke(new Action(delegate ()
        {
            groupBox1.Text = "Link's statistics (" + finished + "/" + linksUrlElements + ")";
        }));
    });

Я также видел, что использование ЦП намного выше, чем Parallel for eachвместоfor each

00C #, параллельная обработка, стек переполнение, HTML-аджилить-пакет,
Похожие вопросы