【问题标题】:Download multiple files with Async使用异步下载多个文件
【发布时间】:2015-09-18 10:18:37
【问题描述】:

我有这段代码可以很好地下载一个文件。

如何添加多个文件以下载此代码?

 private void Form1_Load(object sender, EventArgs e)
 {
     WebClient client = new WebClient();
     client.DownloadProgressChanged += Client_DownloadProgressChanged;
     client.DownloadFileCompleted += Client_DownloadFileCompleted;
     client.DownloadFileAsync(new Uri("http://download.thinkbroadband.com/10MB.zip"), @"c:\folder\10MB.zip");
 }

 private void Client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
 {
     MessageBox.Show("completed");
 }

 private void Client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
 {
     progressBar1.Maximum = (int)e.TotalBytesToReceive / 100;
     progressBar1.Value = (int)e.BytesReceived / 100;
 }

【问题讨论】:

  • 多次致电DownloadFileAsync()。如果你的问题是“但是如何更新我的进度条”,那么恭喜你,你已经问到一个无法解决的问题的答案。您事先不知道文件将有多大,因此您必须考虑替代方案。例如,如果要下载 10 个文件,让每个文件在进度条上代表 10%。 (blogs.msdn.com/b/oldnewthing/archive/2004/01/06/47937.aspx)
  • @CodeCaster:好吧,您可以使用 HttpWebRequest 而不是 WebClient 发送请求。这个类更复杂,提供更多的功能。 如果服务器提供内容长度,您可能需要下载的总字节数。您不需要立即读取流,您可以随时按顺序读取所有流。
  • @CodeCaster 这不是不可能的,但也不是微不足道的,并且可能无法使用 WebClient 完成。使用 HttpClient,OP 可以在开始下载之前从响应头中检查每个文件的大小。这可以设置最大值。进度事件应更新单个 received 计数器。事实上,多个下载操作可以发布到同一个Progress<T> 对象,确保一次只处理一个更新事件。
  • @PanagiotisKanavos HttpClient 也使用此信息,即在显示的 DownloadProgressChanged 事件中 (e.TotalBytesToReceive)。但是,您并不总是知道 HTTP 响应会有多大,例如在读取分块响应时。见RFC 7230 Section 3.3.3. Message Body Length

标签: c# asynchronous download


【解决方案1】:

您可以创建多个进度条和多个 Web 客户端。每个WebClient 都应该使用适当的进度条。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    相关资源
    最近更新 更多