[英]How Can I optimize my FTP Download using foreach() and ftpwebrequest?
这是我正在使用的代码,它可以工作,但是应用程序的ftp部分大约需要5分钟。
他们自己的文件不是太大,但是我想优化应用程序,我觉得这是最好的起点。
我想做的是下载4个特定文件。
这是文件大小:
1-〜48mb 2-〜856k 3-〜25mb 4-〜49mb
// BEGIN FTP
WebClient request = new WebClient();
request.Credentials =
new NetworkCredential(this.userNameRTF.Text,
this.passRTF.Text);
string[] ftpFile = new string[4];
ftpFile[0] = "1";
ftpFile[1] = "2";
ftpFile[2] = "3";
ftpFile[3] = "4";
foreach(string s in ftpFile)
{
string ftpFileName = s;
byte[] fileData =
request.DownloadData(this.ftpHost
+ this.ftpPath.Text + ftpFileName);
FileStream file =
File.Create(@"\\nas03\customerftp\" + custName.Text + @"\" + ftpFileName);
file.Write(fileData, 0, fileData.Length);
file.Close();
}
谢谢您的帮助!
为什么不使用API处理这些:
WebClient request = new WebClient();
request.Credentials = new NetworkCredential(this.userNameRTF.Text,
this.passRTF.Text);
string[] ftpFiles = new[] { "1", "2", "3", "4" };
var tasks = ftpFiles.Select(f => request.DownloadFileTaskAsync(
this.ftpHost + this.ftpPath.Text + ftpFileName,
@"\\nas03\customerftp\" + custName.Text + @"\" + ftpFileName));
Task.WaitAll(tasks.ToArray());
除了简化代码外,这还将同时下载和保存文件。
请注意,您可以通过将最后一行切换到以下方式来使它成为异步方法(在.NET 4.5 / C#5中):
await Task.WhenAll(tasks);
假设您使用的是.NET 4,则可以使用旧的DownloadFileAsync
方法:
WebClient request = new WebClient();
request.Credentials = new NetworkCredential(this.userNameRTF.Text,
this.passRTF.Text);
var ftpFiles = new[] { "1", "2", "3", "4" };
var ce = new CountdownEvent(ftpFiles.Length);
request.DownloadFileCompleted += (o,e) => ce.Signal();
foreach(var file in ftpFiles)
request.DownloadFileAsync(new Uri(this.ftpHost + this.ftpPath.Text + ftpFileName),
@"\\nas03\customerftp\" + custName.Text + @"\" + ftpFileName));
ce.Wait();
您需要告诉您文件的来源,带宽,以及带宽。 从几行代码来看,除了您的Internet连接本身之外,似乎没有任何明显的瓶颈。 只需计算使用带宽即可下载多少数据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.