You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 18:36:03