使用WebClient下载文件时毫秒级触发完成事件且未实际下载如何解决
问题根因
- 保存路径参数错误
调用DownloadFileAsync方法时,第二个参数要求传入完整的保存文件路径,你仅传入了桌面文件夹路径,WebClient无法直接向文件夹写入数据,触发参数错误后直接终止任务,所以会立刻触发完成事件、无实际下载行为、进度条无更新。 - 事件重复绑定冗余
DownloadProgressChanged和DownloadFileCompleted事件各绑定了两次处理方法,属于无效代码,会导致同一段逻辑重复执行两次。 - 缺少异常校验逻辑
完成事件中没有对AsyncCompletedEventArgs.Error属性做判断,无法感知下载过程中的报错,自然无法定位任务立刻结束的原因。 - (可选优化)进度计算逻辑冗余
你当前通过字节数除以100计算进度,实际上可以直接使用DownloadProgressChangedEventArgs.ProgressPercentage属性直接获取已完成百分比,逻辑更简洁,也能避免整数除法带来的精度偏差。
修正后可运行代码
using System.IO; using System.Net; // 其他原有代码保留,仅修改相关方法即可 private void Download() { WebClient client = new WebClient(); string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory); // 拼接完整的保存文件路径,必须指定具体文件名 string fullSavePath = Path.Combine(desktopPath, "10GB.bin"); // 仅保留一组需要的事件绑定,删除重复的绑定逻辑 client.DownloadProgressChanged += Client_DownloadProgressChanged; client.DownloadFileCompleted += Client_DownloadFileCompleted; // 传入正确的保存路径参数 client.DownloadFileAsync(new Uri("https://speed.hetzner.de/10GB.bin"), fullSavePath); } private void Client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e) { // 增加异常和取消状态判断,方便定位问题 if (e.Error != null) { label1.Text = $"下载失败:{e.Error.Message}"; return; } if (e.Cancelled) { label1.Text = "下载已取消"; return; } label1.Text = "下载完成"; } private void Client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) { // 直接使用自带的进度百分比属性简化逻辑 progressBar1.Maximum = 100; progressBar1.Value = e.ProgressPercentage; } private void button1_Click(object sender, EventArgs e) { Download(); }
内容的提问来源于stack exchange,提问作者Daniel Lip
相关产品推荐
相关产品推荐

