【发布时间】:2014-07-23 08:54:12
【问题描述】:
我正在编写一个从网页抓取数据的 C# 控制台应用程序。
此应用程序将访问大约 8000 个网页并抓取数据(每个页面上的数据格式相同)。
我现在可以在没有异步方法和多线程的情况下使用它。
但是,我需要它更快。它只使用大约 3%-6% 的 CPU,我认为是因为它花费了等待下载 html 的时间。(WebClient.DownloadString(url))
这是我程序的基本流程
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 ;
}
【问题讨论】:
-
看看PLinq the8000urls.AsParallel().ForAll(...)。 msdn.microsoft.com/en-
-
@asawyer
AsParallel会起作用,但会有点浪费,因为它会产生线程来等待固有的异步操作。当然,它更容易并且可以工作,但还有更优雅的解决方案。
标签: c# multithreading .net-4.5