写一些网页抓片的新手,所以我为此道歉。我正在尝试减少此应用程序的运行时间。当通过大约100个股票的列表运行需要超过30秒(为简洁起见,我只包括5个列表)。有没有办法通过线程/异步编程来提高效率?我可能会遇到雅虎服务器想要立即发送回单个IP的限制。最终我的目标是创建一个类“库存”,其中包含一系列属性,可以获取基于Web的数据。
static void Main(string[] args)
{
List<string> stocks = new List<string>() { "AA", "AAL", "AAPL", "ABX", "ADBE" };
foreach (var stock in stocks)
{
Task.Factory.StartNew(() => { getPrice(stock); });
}
Console.ReadLine();
}
private static void getPrice(string stock)
{
var webGet = new HtmlWeb();
var doc = webGet.Load("http://finance.yahoo.com/q?s=" + stock);
HtmlNode ourNode = doc.DocumentNode.SelectSingleNode("//*[@id=\"yfs_l84_" + stock.ToString().ToLower() + "\"]");
if (ourNode != null)
{
Console.WriteLine(stock + ": " + ourNode.InnerText);
}
}
答案 0 :(得分:1)
使用Parallel.ForEach循环,但不要指望有大的改进,因为雅虎响应时间的速度取决于99%。
Parallel.ForEach(stocks, stock =>
{
getPrice(stock);
});
使用Parallel.ForEach,您还可以设置并行度(正在执行的并发操作数)。
Parallel.ForEach(stocks, new ParallelOptions() { MaxDegreeOfParallelism = 3 }, stock =>
{
getPrice(stock);
});
有关详细信息,请查看MSDN文档:https://msdn.microsoft.com/en-us/library/dd460720%28v=vs.110%29.aspx和https://msdn.microsoft.com/en-us/library/system.threading.tasks.parallel%28v=vs.110%29.aspx