Windows Communication, Web Client 异步文件下载器





3.00/5 (3投票s)
使用 WebClient 类下载资源的简单方法
引言
本项目旨在展示如何使用 WebClient
类轻松实现无限数量文件的异步下载。 关键功能是使用 DownloadFileAsync
和一些回调函数来实现的,这些回调函数报告关于活动下载的进度信息。
该项目未使用任何额外的线程。 所有内容都使用异步回调方法实现,这些方法由 WebClient
对象在下载器的内部状态发生变化时调用。
一些屏幕截图
首先,查看当一些并行下载正在进行时程序窗口的样子。 您可以根据需要添加任意数量的下载任务。

图 1. 多个异步下载正在进行中。

图 2. 多个异步下载已完成。 其中一个已被取消,第二个已完成。
功能概念

图 3. 交互图。
最初,创建一个主进程,它向用户显示一个带有 URI 输入字段、一个启动下载过程的添加按钮以及一个用于显示每个 WebClient
状态(实时)的 listview
的主窗口(图 3)。 用户按下添加按钮 ([+]) 后,DownloaderTask
对象创建一个新的下载器,并为其分配进度回调和结束回调事件。
下载立即开始。 资源被保存到当前文件夹,名称是从 URI 的最后一个段自动提取的。
fileName = this.uriData.Segments[this.uriData.Segments.Length - 1];
逻辑结构

图 4. 类图。
当用户按下添加按钮时,将创建 DownloaderTask
对象并将其添加到 dwnTasks
列表中(图 4)
dwnTasks.Add(new DownloaderTask(tbUri.Text, lvDownloads));
第一个参数表示 URI,第二个参数是 listview
,下载任务对象本身会在其中为下载的文件创建一个信息组并持续更新。 DownloaderTask
构造函数将创建一个 WebClient()
对象,然后将分配回调
webClient.DownloadProgressChanged +=
new DownloadProgressChangedEventHandler(webClient_DownloadProgressChanged);
webClient.DownloadFileCompleted += new System.ComponentModel.AsyncCompletedEventHandler
(webClient_DownloadFileCompleted);
此外,DownloaderTask
对象的构造函数会在传入的 listview
中创建一个组(如果不是 null
),该组将描述可下载文件的当前状态以及结束时的操作结果(参见图 2)。
结论
当然,还有一些待办事项,例如
- 删除未完成的已下载文件(在失败或取消后)
- 允许用户选择目标文件夹和文件名等。
历史
- 2008 年 5 月 27 日:初始版本