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

C#中如何等待文件完全下载完成?

解决方案:确保WebClient下载完成后再解压文件

一、先明确核心事实

你当前代码里的webClient.DownloadFile()是同步阻塞方法,它会一直等待文件100%下载完成后,才会执行后续的ZipFile.ExtractToDirectory()。也就是说,你的现有代码本身已经满足“下载完成再解压”的需求。如果实际运行中出现未下载完就解压的问题,大概率是路径错误、异常未捕获等其他问题,而非方法本身的执行顺序问题。

二、优化后的同步代码(更健壮)

可以补充异常捕获、资源释放和路径合法性处理,避免意外情况:

public static void DownloadServicePackage()
{
    // 用系统API自动获取当前用户名,避免手动替换出错
    string userName = Environment.UserName;
    FilePath = $@"C:\Users\{userName}\AppData\TestExe.zip";
    string extractPath = $@"C:\Users\{userName}\AppData";

    // 提前创建目标目录,避免路径不存在报错
    Directory.CreateDirectory(Path.GetDirectoryName(FilePath));
    Directory.CreateDirectory(extractPath);

    // 使用using自动释放WebClient资源
    using (WebClient webClient = new WebClient())
    {
        try
        {
            // 同步下载,阻塞到完成
            webClient.DownloadFile("https://stg.test.com/downloadScript/TestExe.zip", FilePath);
            // 到这一步文件已完全下载,执行解压
            ZipFile.ExtractToDirectory(FilePath, extractPath, overwriteFiles: true);
        }
        catch (WebException ex)
        {
            // 处理下载异常(网络错误、资源不存在等)
            Console.WriteLine($"下载失败:{ex.Message}");
        }
        catch (IOException ex)
        {
            // 处理文件操作异常(解压失败、文件被占用等)
            Console.WriteLine($"文件操作失败:{ex.Message}");
        }
    }
}

public MainWindow()
{ 
    InitializeComponent(); // WPF构造函数必须保留组件初始化
    DownloadServicePackage();
    DownloadFile();
}

三、异步版本(避免阻塞UI线程)

如果是在WPF窗口构造函数中调用,同步方法会导致窗口加载卡顿。这种情况建议用异步方法配合async/await,既保证等待下载完成再解压,又不阻塞UI:

public static async Task DownloadServicePackageAsync()
{
    string userName = Environment.UserName;
    FilePath = $@"C:\Users\{userName}\AppData\TestExe.zip";
    string extractPath = $@"C:\Users\{userName}\AppData";

    Directory.CreateDirectory(Path.GetDirectoryName(FilePath));
    Directory.CreateDirectory(extractPath);

    using (WebClient webClient = new WebClient())
    {
        try
        {
            // 异步下载,await会等待下载完成再执行后续代码
            await webClient.DownloadFileTaskAsync(
                new Uri("https://stg.test.com/downloadScript/TestExe.zip"), 
                FilePath
            );
            ZipFile.ExtractToDirectory(FilePath, extractPath, overwriteFiles: true);
        }
        catch (WebException ex)
        {
            Console.WriteLine($"下载失败:{ex.Message}");
        }
        catch (IOException ex)
        {
            Console.WriteLine($"文件操作失败:{ex.Message}");
        }
    }
}

// WPF构造函数不能直接标记为async,需通过异步初始化方法调用
public MainWindow()
{
    InitializeComponent();
    _ = InitializeAsync();
}

private async Task InitializeAsync()
{
    await DownloadServicePackageAsync();
    await DownloadFileAsync(); // 建议把DownloadFile也改成异步版本
}

关键注意点

  • 同步DownloadFile本身就是阻塞执行,无需额外等待逻辑
  • 异步场景下必须用await配合DownloadFileTaskAsync,否则会出现下载未完成就执行解压的问题
  • 始终添加异常捕获,避免下载失败时仍执行解压操作

内容的提问来源于stack exchange,提问作者Shivani G

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 16:06:25