我有一个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中。但是将它们写入我的硬盘大约需要一分钟。有没有更快的方法将这些文件下载到我的硬盘?
此外,我通过我编写的文件获取有关这些文件计数的信息,那么有更好的方法可以下载所有这些文件吗?
答案 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;
我要小心允许的连接数,太高的限制也可能成为一个问题。希望这会有所帮助。