2015-11-24 4 views
1

В основном, я хочу получить доступ к большому количеству страниц из того же URl, но я не хочу спамить его в том же secound.And, я его не рассмотрю 30 минут. Не работает ли Thread.Sleep() внутри параллели? Потому что только после 90 минут я сделал это.Параллельный для каждого с Thread.Sleep

 var pages = new List<string>(urls); 
     var sources = new BlockingCollection<string>(); 

     string htmlCode = ""; 

     Random randomN = new Random(); 

     Parallel.ForEach(pages, x => 
     { 
      x = x.Replace("//", "http://"); 
      int sleep = randomN.Next(0, 1800000); 
      Thread.Sleep(sleep); 

      HttpWebResponse response = null; 
      CookieContainer cookie = new CookieContainer(); 

      HttpWebRequest newRequest = (HttpWebRequest)WebRequest.Create(x); 
      newRequest.Timeout = 15000; 
      newRequest.Proxy = null; 
      newRequest.CookieContainer = cookie; 
      newRequest.UserAgent = "Mozilla/5.0(Windows NT 5.1) AppleWebKit/537.11(KHTML, like Gecko) Chrome/23.0.1300.0 Iron/23.0.1300.0 Safari/537.11"; 
      newRequest.ContentLength = 0; 
      response = (HttpWebResponse)newRequest.GetResponse(); 
      htmlCode = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding(1252)).ReadToEnd(); 
      sources.Add(htmlCode); 

     }); 

     return sources; 

ответ

0

Требование не очень ясно, однако, о том, чего вы пытаетесь достичь. Но Thread.Sleep в параллель. Возможно, это не лучший вариант. Попробуйте пройти через потоки ниже, они могут быть полезны и решить вашу проблему.

[1]. Parallel.ForEach using Thread.Sleep equivalent

[2]. Thread.Sleep blocking parallel execution of tasks

[3]. Parallel ForEach wait 500 ms before spawning

0

Вы не хотите спать внутри своего тела Parallel.ForEach - это просто связать рабочие потоки в пуле потоков .NET.

Это то, что Task.Delay для. Просто создайте кучу отложенных задач, а затем сделайте WaitAll на них.

+0

О, и несвязанный совет: никогда не используйте один экземпляр System.Random внутри тела Parallel.ForEach ... он не является потокобезопасным и будет ужасно разорваться (начинает возвращаться только ноль). См. Это [запись в блоге] (http://blogs.msdn.com/b/pfxteam/archive/2009/02/19/9434171.aspx) для обходных решений. –

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