Какой самый быстрый способ загрузки источников веб-страниц? - PullRequest
0 голосов
/ 30 апреля 2019

Мне нужно скачать множество источников веб-страниц.Поэтому мне нужно сделать это как можно быстрее.Вот мои коды.

  private static async Task<string> downloadsource(string link)
  {                
     ServicePointManager.Expect100Continue = false;
     WebRequest req = WebRequest.Create(link);
     req.Proxy = null;
     req.Method = "GET";
     WebResponse res = await siteyeBaglantiTalebi.GetResponseAsync();
     StreamReader read = new StreamReader(res.GetResponseStream());
     return read.ReadToEnd();           
  }

  List<string> links = new List<string>(){... including some web page links};

  private static List<string> source_list(List<string> links)
  {
      List<string> sources = new List<string>();

      for (int i = 0; i < links.Count; i++)
      {
          Task<string> _task = downloadsource(links[i]);
          Console.WriteLine("Downloaded : " + i);
          sources.Add(_task.Result);
      }            

          return sources;
  }

Мне было интересно, является ли этот код самым быстрым способом или его можно улучшить.Можете ли вы помочь мне с этим?

1 Ответ

0 голосов
/ 01 мая 2019

Вы выполняете вызов _task.Result внутри каждого цикла. Ваш код будет работать так же быстро, как если бы вы загружали каждую страницу одну за другой, если вы так ее кодируете.

Попробуйте вместо этого:

private async static Task<List<string>> source_list(List<string> links)
{
    List<Task<string>> sources = new List<Task<string>>();

    for (int i = 0; i < links.Count; i++)
    {
        Task<string> _task = downloadsource(links[i]);
        Console.WriteLine("Downloading : " + i);
        sources.Add(_task);
    }

    return (await Task.WhenAll(sources)).ToList();
}

Это было бы еще лучше:

private async static Task<string[]> source_list(List<string> links)
{
    return await Task.WhenAll(links.Select(l => downloadsource(l)));
}

Также я убрал ваш downloadsource метод:

private static async Task<string> downloadsource(string link)
{
    ServicePointManager.Expect100Continue = false;
    WebRequest req = WebRequest.Create(link);
    req.Proxy = null;
    req.Method = "GET";
    using (WebResponse res = await req.GetResponseAsync())
    {
        using (StreamReader read = new StreamReader(res.GetResponseStream()))
        {
            return read.ReadToEnd();
        }
    }
}
...