2015-09-17 3 views
2

Невероятно новое для написания чего-то веб-соскабливания, поэтому я прошу прощения за это. Я пытаюсь сократить время выполнения этого приложения. При запуске списка около 100 акций занимает более 30 секунд (я просто включил список из 5 для краткости). Есть ли способ повысить эффективность при потоковом/асинхронном программировании? Я могу столкнуться с ограничением того, сколько серверов yahoo хочет отправить обратно сразу на один IP-адрес. В конечном итоге моя цель - создать класс «запас», в котором есть куча свойств, которые будут извлекать данные в Интернете, подобные этому.HTMLAgility speeding webget

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

Используйте цикл Parallel.ForEach, но не ожидает, что значительное улучшения, поскольку скорость зависит 99% от времени отклика Yahoo.

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

+0

Хорошо большой. Я дам этот снимок, возможно, в методе, который я буду крутить между несколькими разными сайтами, чтобы ускорить его. Как и Google/Nasdaq и т. Д. – user2163343

+0

Да, обратите внимание, когда вы вызываете поисковые системы, такие как Google и т. Д., Потому что в течение небольшого времени вы получаете слишком много запросов, вы будете временно заблокированы. В этом случае вам придется где-то хранить данные и обновлять их по расписанию. –

Смежные вопросы