从Http下载许多异步文件

时间:2018-02-07 16:33:17

标签: c# http asynchronous

我有一个http服务器,每次我在PC上启动应用程序时,我都需要从该服务器下载文件到我的电脑,我需要下载大约五千个文件,每个文件大约1-2 kb。这是我用它的代码:

WebClient[][] wbc = new WebClient[1][];

for(int file=0 ; file < myfilecount ; file++)
{
    wbc[0][film] = new WebClient();
    wbc[0][film].Credentials = new NetworkCredential(username, password);
    wbc[0][film].DownloadFileCompleted += Form4_DownloadFileCompleted;
    wbc[0][film].DownloadFileTaskAsync("http://MYIPADDRESS/File" + file.ToString(), databaselocation + "\\File" + file.toString());
}

当我这样做时,它会在大约3秒内将文件下载到ram中。但是将它们写入我的硬盘大约需要一分钟。有没有更快的方法将这些文件下载到我的硬盘?

此外,我通过我编写的文件获取有关这些文件计数的信息,那么有更好的方法可以下载所有这些文件吗?

1 个答案:

答案 0 :(得分:0)

我同意,如果需要每次在电脑上启动应用,您都应该重新考虑这个过程。但话说回来,我并不完全了解你的情况。除此之外,您可以排队请求任务并同时等待它们:

var requestTasks = Enumerable.Range(0, myFileCount).Select(i => {
  var webClient = new WebClient
  {
     Credentials = new NetworkCredential(username, password),
     DownloadFileCompleted += Form4_DownloadFileCompleted
  };  

  return webClient.DownloadFileTaskAsync("http://MYIPADDRESS/File" + i.ToString(), Path.Combine(databaselocation, "file" + i.ToString()));
});

await Task.WhenAll(requestTasks);

另外我认为WebClient仅限于可以同时发送到同一主机的请求数,您可以使用ServicePointManager进行配置:

ServicePointManager.DefaultConnectionLimit = carefullyCalculatedNumber;

我要小心允许的连接数,太高的限制也可能成为一个问题。希望这会有所帮助。