我正在编写一个C#控制台应用程序,从网页上爬取数据。
这个应用程序将会访问大约8000个网页并且爬取数据(每个页面的数据格式相同)。
目前我已经使程序可以正常工作,但是没有使用异步方法和多线程。
然而,我需要让程序运行更快。我认为这是因为它在等待下载HTML文件(WebClient.DownloadString(url)),所以只使用了CPU的3%-6%。
以下是我的程序的基本流程:
DataSet alldata;
foreach(var url in the8000urls)
{
// ScrapeData downloads the html from the url with WebClient.DownloadString
// and scrapes the data into several datatables which it returns as a dataset.
DataSet dataForOnePage = ScrapeData(url);
//merge each table in dataForOnePage into allData
}
// PushAllDataToSql(alldata);
我一直在尝试使用多线程来处理这个问题,但不确定如何正确地开始。我正在使用.net 4.5,据我理解,4.5中的异步和等待是为了更容易编程,但我仍然有点迷茫。
我的想法是只需保持创建新的异步线程来处理此行:
DataSet dataForOnePage = ScrapeData(url);
然后每当一个完成,就运行
//merge each table in dataForOnePage into allData
有人能指导我如何在 .net 4.5 c# 中将那一行变成异步,并在完成后运行我的合并方法吗?
谢谢。
编辑:这是我的 ScrapeData 方法:
public static DataSet GetProperyData(CookieAwareWebClient webClient, string pageid)
{
var dsPageData = new DataSet();
// DOWNLOAD HTML FOR THE REO PAGE AND LOAD IT INTO AN HTMLDOCUMENT
string url = @"https://domain.com?&id=" + pageid + @"restofurl";
string html = webClient.DownloadString(url);
var doc = new HtmlDocument();
doc.LoadHtml(html );
// A BUNCH OF PARSING WITH HTMLAGILITY AND STORING IN dsPageData
return dsPageData ;
}
AsParallel
可以工作,但它会有点浪费,因为它会生成线程来等待固有的异步操作。尽管如此,它更容易并且可以工作,但还有更优雅的解决方案。 - casperOne