桌面工具里下载并显示进度是很常见的需求。WebClient 的 DownloadFileAsync 配合事件就能拿到实时百分比,虽然新项目更推荐 HttpClient,但在老框架工具与 WinForms 场景中仍是零依赖的最简方案。

实现思路

订阅 DownloadProgressChanged 读取 e.ProgressPercentage 刷新进度;DownloadFileCompleted 里判断是否出错并提示结果;异步下载不阻塞界面线程,配合进度条控件可直接绑定。

完整代码

using System;
using System.Net;

class Program
{
    static void Main()
    {
        using (var client = new WebClient())
        {
            client.DownloadProgressChanged += (s, e) =>
            {
                Console.Write("下载进度:" + e.ProgressPercentage + "%  ");
                Console.SetCursorPosition(0, Console.CursorTop);
            };

            client.DownloadFileCompleted += (s, e) =>
            {
                Console.WriteLine();
                if (e.Error == null)
                    Console.WriteLine("下载完成");
                else
                    Console.WriteLine("下载失败:" + e.Error.Message);
            };

            client.DownloadFileAsync(
                new Uri("https://example.com/setup.zip"),
                "D:/setup.zip");
        }
        Console.ReadLine();
    }
}

使用要点

  • WinForms 中把百分比直接赋给 ProgressBar.Value 即可实现进度条;
  • 需要取消下载时调用 CancelAsync,注意完成后及时释放对象避免句柄泄漏;
  • 需要断点续传、HTTP/2 或更细粒度控制时请改用 HttpClient。

小结

WebClient 把下载与进度封装得足够简单,适合工具类程序的快速开发;对网络稳定性要求高的场景再迁移到 HttpClient 加流式读取也不迟。