我正在制作一个小软件,该软件下载了数十万个文件。目前这根本不高,因为我一次下载每个文件,因此非常慢,而且很多文件也小于100k。
您有任何想法提高下载速度吗?
/*******************************
Worker work
/********************************/
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
listCount = _downloadList.Count;
// no GUI method !
while (TotalDownloadFile < _downloadList.Count)
{
// handle closing form during download
if (_worker.CancellationPending)
{
_mainView = null;
_wc.CancelAsync();
e.Cancel = true;
}
else if (!DownloadInProgress && TotalDownloadFile < listCount)
{
_lv = new launcherVersion(_downloadList[TotalDownloadFile]);
var fileToDownloadPath = Info.getDownloadUrl() + _lv.Path;
var saveFileToPath = Path.GetFullPath("./") + _lv.Path;
if (Tools.IsFileExist(saveFileToPath))
File.Delete(saveFileToPath); // remove file if extist
else
// create directory where the file will be created (use api this don't do anything on existing directory)
Directory.CreateDirectory(Path.GetDirectoryName(saveFileToPath));
StartDownload(fileToDownloadPath, saveFileToPath);
UpdateRemaingFile();
_currentFile = TotalDownloadFile;
}
}
}
开始下载功能
/*******************************
start the download of files
/********************************/
public void StartDownload(string fileToDownloadLink, string pathToSaveFile)
{
try
{
using (_wc = new WebClient())
{
_wc.DownloadProgressChanged += client_DownloadProgressChanged;
_wc.DownloadFileCompleted += client_DownloadFileCompleted;
_wc.DownloadFileAsync(new Uri(fileToDownloadLink), pathToSaveFile);
DownloadInProgress = true;
}
}
catch (WebException e)
{
MessageBox.Show(fileToDownloadLink);
MessageBox.Show(e.ToString());
_worker.CancelAsync();
Application.Exit();
}
}
对我的评论进行扩展。您可以可能使用多线程和并发立即下载整个批次。您必须放一些东西来确保每个线程成功完成,并确保文件不会下载两次。您将必须使用锁。
之类的集中列表保护您的集中列表。我将亲自实现3个单独的列表:ReadyToDownload
,DownloadInProgress
和DownloadComplete
。
ReadyToDownload
将包含所有需要下载的对象。DownloadInProgress
既包含要下载的项目,又包含处理下载的任务。DownloadComplete
将容纳下载的所有对象,并引用执行下载的任务。
每个任务在自定义对象的实例中假设工作效果更好。该对象将参考每个列表的引用,并且一旦工作完成或失败,它就会处理更新列表。如果发生故障,您可以添加第四列表以容纳失败的项目,也可以将它们重新插入ReadyToDownload
列表。