Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 下载网页的最快方式是什么;什么消息来源?_C#_Multithreading_Async Await_Task_Httpwebrequest - Fatal编程技术网

C# 下载网页的最快方式是什么;什么消息来源?

C# 下载网页的最快方式是什么;什么消息来源?,c#,multithreading,async-await,task,httpwebrequest,C#,Multithreading,Async Await,Task,Httpwebrequest,我需要下载许多网页的来源。所以我需要尽快做到这一点。这是我的密码 private static async Task<string> downloadsource(string link) { ServicePointManager.Expect100Continue = false; WebRequest req = WebRequest.Create(link); req.Proxy = null;

我需要下载许多网页的来源。所以我需要尽快做到这一点。这是我的密码

  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;
  }
私有静态异步任务下载源(字符串链接)
{                
ServicePointManager.Expect100Continue=false;
WebRequest req=WebRequest.Create(链接);
req.Proxy=null;
req.Method=“GET”;
WebResponse res=wait siteyeBaglantiTalebi.GetResponseAsync();
StreamReader read=新的StreamReader(res.GetResponseStream());
返回read.ReadToEnd();
}
列表链接=新列表(){…包括一些网页链接};
私有静态列表源\列表(列表链接)
{
列表源=新列表();
for(int i=0;i
我想知道这段代码是最快的方法还是可以增强的方法。
你能帮我一下吗?

你正在执行一个
\u任务。结果在每个循环中调用
。你的代码运行的速度就像你一个接一个地下载每个页面一样快

请尝试以下方法:

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();
}

即使有多个线程,这个过程中缓慢的部分始终是请求的实际服务(即网络流量)。如果Web服务器在短时间内拒绝大量请求,您可能会发现自己遇到一些不错的429(太多请求)错误。因此,您的意思是这种用法最快。我认为他的意思是,还有其他因素会影响算法的执行速度。其中两个是连接速度和主机服务器设置。我知道,但当我们假设这些因素正常时,仅从代码的角度来看?您正在执行一个
\u任务。每个循环内的结果
。你的代码运行的速度就像你一个接一个地下载每个页面一样快。
private async static Task<string[]> source_list(List<string> links)
{
    return await Task.WhenAll(links.Select(l => downloadsource(l)));
}
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();
        }
    }
}