Я пишу консольное приложение C #, которое собирает данные с веб-страниц.
Это приложение будет просматривать около 8000 веб-страниц и очищать данные (одного и того же формата данных на каждой странице ).
У меня это работает прямо сейчас без асинхронных методов и без многопоточности.
Однако мне нужно, чтобы это было быстрее. Он использует только около 3% -6% процессора, я думаю, потому что он тратит время на ожидание загрузки 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 ;
}