C#怎么下载网络文件到本地_C#如何显示下载进度条【源码】
应使用 HttpClient 配合流式读取与 IProgressint 主动推送实现可靠下载进度更新避免 WebClient 及其已移除的 DownloadProgressChanged 事件需用临时文件、CancellationToken 和线程安全调度确保健壮性。用 HttpClient 下载文件并实时更新进度条直接用 WebClient 无法可靠获取下载进度尤其在 .NET Core/.NET 5 中已不推荐HttpClient 配合流式读取才是可控方案。关键不是“能不能”而是“怎么让 HttpContent.ReadAsStreamAsync() 和 UI 线程安全协作”。常见错误是把整个响应体一次性 await client.GetByteArrayAsync(url)这会阻塞进度反馈且大文件容易 OOM。必须用 HttpResponseMessage.Content.ReadAsStreamAsync() 获取响应流再分块读取UI 更新如进度条必须通过 Dispatcher.InvokeWPF或 BeginInvokeWinForms回主线程不能在后台线程直接改控件属性记得设置 HttpClient.Timeout否则慢网或中断时会卡死几十秒示例中用 progress.Report((int)(100 * totalRead / contentLength))但注意 contentLength 可能为 -1服务器未返回 Content-Length此时只能靠已读字节数做相对估算DownloadProgressChanged 事件根本不会触发这是 WebClient 的典型幻觉——它只在部分 HTTP 场景下报告进度比如 POST 上传或重定向后重试时行为不一致更严重的是.NET Core 起已移除该事件支持项目若从 .NET Framework 迁移过来编译能过但运行时静默失效。别挣扎了删掉所有 webClient.DownloadProgressChanged ...换成基于 IProgressint 的主动推送模型。 幻导航网 发现优质实用网站,开启网络探索之旅