2013-10-03 3 views
2

Я новичок и хотел бы знать, почему я испытываю ошибку на webclient downloadstring() внутри parallel. Я из ниоткуда знаю, связано ли это с моей медленной связью. Вот мой код:C# Parallel WebClient - операция завершена

for (int i = 2; i <= 5; i++) 
     { 
      string ebayLink = "http://www.ebay.de/sch/Studium-Wissen-/1105/i.html?LH_Auction=1&_sop=1&_nkw=&_pgn=" + i; 
      //string ebayLink = "http://www.ebay.de/sch/Schule-Ausbildung-/40434/i.html?LH_Auction=1&_sop=1&_nkw=&_pgn=" + i; 
      ebayLink = "http://www.ebay.de/sch/i.html?LH_Auction=1&_sacat=0&_from=R40&_nkw=B%C3%BCcher&_sop=1&_pgn=" + i; 

      HtmlWeb hw = new HtmlWeb(); 
      HtmlAgilityPack.HtmlDocument doc = hw.Load(ebayLink); 


      List<string> eanList = new List<string>(); 

      List<string> links = new List<string>(); 

      foreach (var link in doc.DocumentNode.SelectNodes("//a[@href]")) 
      { 
       string url = link.GetAttributeValue("href", ""); 
       if (url.Contains(".de/itm") && !links.Contains(url) && !url.Contains("pt=Zeitschriften") && !url.Contains("pt=Belletristik")) 
       { 
        links.Add(url); 
       } 
      } 

      Parallel.ForEach(links, link => 
      { 
       WebClient wc = new WebClient(); 
       string html = wc.DownloadString(link); 

       EbayItem ebayItem = new EbayItem(html); 

       string ean = ebayItem.ean; 


       string amazonUsedPrice = string.Empty; 

       amazonUsedPrice = getAmazonUsedPrice(ean); 

       Product product = new Product(); 
       product.EbayUrl = link; 
       product.Ean = ean; 
       product.AmazonPriceString = amazonUsedPrice; 
       product.ebayItem = ebayItem; 
       productList.Add(product); 


      } 
    );} 

Ошибка возникает в string html = wc.DownloadString(link);. Я вижу на выходе, что он останавливается, когда он достигает не менее 20 ссылок.

+0

Какая ошибка? – zimdanen

+0

«Операция тайм-аута» - это ошибка, указывающая на веб-клиент downloadString() –

+0

Неужели вам это удалось, используя параллельную библиотеку? – usefulBee

ответ

1

Соединения ждут, когда предыдущие соединения закроются, а значит, истекло время ожидания. Ограничение по умолчанию для одновременных подключений к одной и тому же хосту 2. Попробуйте увеличить этот предел перед входом в ваш Parallel вызова:

System.Net.ServicePointManager.DefaultConnectionLimit = int.MaxValue; 

Подробнее о DefaultConnectionLimithere.

Свойство Значение

Тип: System.Int32

Максимальное количество одновременных соединений, разрешенных объектом ServicePoint. Значение по умолчанию равно 2.

+0

Но мне кажется, что это не работает. –

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