ProgressBar进度更改与所有需要下载的文件

时间:2015-08-24 19:37:32

标签: c# wpf progress-bar webclient downloading

我正在创建一个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);
    }

} 

1 个答案:

答案 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"]);