HTMLAgility加速了webget

时间:2015-09-17 23:03:50

标签: c# asynchronous

写一些网页抓片的新手,所以我为此道歉。我正在尝试减少此应用程序的运行时间。当通过大约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);
        }
    }

1 个答案:

答案 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.aspxhttps://msdn.microsoft.com/en-us/library/system.threading.tasks.parallel%28v=vs.110%29.aspx