C # - как сделать несколько веб-запросов одновременно - PullRequest
0 голосов
/ 14 сентября 2018

Я написал код для проверки URL, однако они работают очень медленно ... Я хочу попробовать заставить его работать на нескольких URL одновременно, например, на 10 URL или, по крайней мере, сделать это как можно быстрее.

мой код:

Parallel.ForEach(urls, new ParallelOptions {
  MaxDegreeOfParallelism = 10
}, s => {
  try {
    using(HttpRequest httpRequest = new HttpRequest()) {
      httpRequest.UserAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0";
      httpRequest.Cookies = new CookieDictionary(false);
      httpRequest.ConnectTimeout = 10000;
      httpRequest.ReadWriteTimeout = 10000;
      httpRequest.KeepAlive = true;
      httpRequest.IgnoreProtocolErrors = true;
      string check = httpRequest.Get(s + "'", null).ToString();
      if (errors.Any(new Func < string, bool > (check.Contains))) {
        Valid.Add(s);
        Console.WriteLine(s);
        File.WriteAllLines(Environment.CurrentDirectory + "/Good.txt", Valid);
      }
    }
  } catch {

  }
});

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Маловероятно, что ваши сервисные вызовы привязаны к процессору .Так что раскручивание большего количества потоков для обработки нагрузки, возможно, не лучший подход - вы получите лучшую пропускную способность, если вместо этого будете использовать async и await, если сможете, используя вместо этого более современный HttpClient HttpRequest или HttpWebRequest.

Вот пример того, как это сделать:

var client = new HttpClient();

//Start with a list of URLs
var urls = new string[]
    {
        "http://www.google.com",
        "http://www.bing.com"
    };

//Start requests for all of them
var requests  = urls.Select
    (
        url => client.GetAsync(url)
    );

//Wait for all the requests to finish
await Task.WhenAll(requests);

//Get the responses
var responses = requests.Select
    (
        task => task.Result
    );

foreach (var r in responses)
{
    var s = await r.Content.ReadAsStringAsync();
    Console.WriteLine(r);
}
0 голосов
/ 14 сентября 2018

Попробуйте сделать, как показано ниже.

Parallel.ForEach(urls, new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount - 1 }

По крайней мере, он гарантирует, что все ядра используются, оставляя 1, чтобы на вашем компьютере не было недостаточно памяти.

Также рассмотрите комментарий @KSib.

...