我正在创建一个WPF应用程序,我使用WebClient从Web服务器下载文件。我有一个URL列表,其中包含我必须下载的所有文件。我使用foreach循环遍历每个URL并同时下载每个URL。第一个URL在移动到下一个URL之前完成很多。我知道每个文件的大小。有没有办法我可以设置我的e.ProgressPercentage来了解所有文件的大小,而不是为每个文件加载0到100%。我知道我现在正在为每个URL调用DownloadProtocol,这是一个新的WebClient实例,但这是我能想到的唯一方法来实现我的解决方案,即一次下载一个文件。
public DownloadStart()
{
foreach(var url in ListOfDownloadURL)
{
DownloadGameFile dlg = new DownloadGameFile();
await dlg.DownloadProtocol(url, myLocation);
}
}
DownloadGameFile类中的下载功能:
public async Task DownloadProtocol(string address, string location)
{
Uri Uri = new Uri(address);
using (WebClient client = new WebClient())
{
//client.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed);
//client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(DownloadProgress);
client.DownloadProgressChanged += (o, e) =>
{
Console.WriteLine(e.BytesReceived + " " + e.ProgressPercentage);
//ProgressBar = e.ProgressPercentage (total)
};
client.DownloadFileCompleted += (o, e) =>
{
if (e.Cancelled == true)
{
Console.WriteLine("Download has been canceled.");
}
else
{
Console.WriteLine("Download completed!");
}
};
await client.DownloadFileTaskAsync(Uri, location);
}
}
答案 0 :(得分:0)
为什么不采取简单的方法,只是在文件完成后更新进度?有点像...
ProgressBar p = new ProgressBar();
p.Maximum = ListOfDownloadURL.Count();
foreach(var url in ListOfDownloadURL)
{
DownloadGameFile dlg = new DownloadGameFile();
await dlg.DownloadProtocol(url, myLocation);
p.Value += 1;
}
或者,如果你坚持,你可以在开始下载之前查询文件大小,总计所有文件的总字节数,然后计算DownloadProgressChanged
被触发时的百分比。
var bytes = Convert.ToInt64(client.ResponseHeaders["Content-Length"]);