У меня есть простой код для синтаксического анализа 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,
У меня есть простой код для синтаксического анализа 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