c# - 带进度条的异步文件下载

标签 c# asynchronous progress-bar

我正在尝试让进度条的进度随着 WebClient 下载进度的变化而变化。此代码仍在下载文件,但当我调用 startDownload() 时,窗口在下载文件时卡住。我希望用户能够在启动画面加载时看到进度变化。有什么方法可以解决此问题,以便用户可以看到 progressBar2 更改的进度吗?

private void startDownload()
{
    WebClient client = new WebClient();
    client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(client_DownloadProgressChanged);
    client.DownloadFileCompleted += new AsyncCompletedEventHandler(client_DownloadFileCompleted);
    client.DownloadFileAsync(new Uri("http://joshua-ferrara.com/luahelper/lua.syn"), @"C:\LUAHelper\Syntax Files\lua.syn");
}
void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
    double bytesIn = double.Parse(e.BytesReceived.ToString());
    double totalBytes = double.Parse(e.TotalBytesToReceive.ToString());
    double percentage = bytesIn / totalBytes * 100;
    label2.Text = "Downloaded " + e.BytesReceived + " of " + e.TotalBytesToReceive;
    progressBar1.Value = int.Parse(Math.Truncate(percentage).ToString());
}
void client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
{
    label2.Text = "Completed";
}

最佳答案

当您单击startDownload() 时,UI 线程将被卡住。如果您不想卡住表单,可以在另一个线程中使用 startDownload() 并在跨线程中进行进度更新。 一种方式,

private void startDownload()
{
    Thread thread = new Thread(() => {
          WebClient client = new WebClient();
          client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(client_DownloadProgressChanged);
          client.DownloadFileCompleted += new AsyncCompletedEventHandler(client_DownloadFileCompleted);
          client.DownloadFileAsync(new Uri("http://joshua-ferrara.com/luahelper/lua.syn"), @"C:\LUAHelper\Syntax Files\lua.syn");
    });
    thread.Start();
}
void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
    this.BeginInvoke((MethodInvoker) delegate {
        double bytesIn = double.Parse(e.BytesReceived.ToString());
        double totalBytes = double.Parse(e.TotalBytesToReceive.ToString());
        double percentage = bytesIn / totalBytes * 100;
        label2.Text = "Downloaded " + e.BytesReceived + " of " + e.TotalBytesToReceive;
        progressBar1.Value = int.Parse(Math.Truncate(percentage).ToString());
    });
}
void client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
{
    this.BeginInvoke((MethodInvoker) delegate {
         label2.Text = "Completed";
    }); 
}

像这样在谷歌阅读更多多线程 http://msdn.microsoft.com/en-us/library/ms951089.aspx

-修复了丢失的 close );到 bgThread 声明

关于c# - 带进度条的异步文件下载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9459225/

相关文章:

javascript - 为什么回调函数允许我们在 Javascript 中异步执行操作?

php - Facebook 注册插件 - 异步验证(电子邮件)

C# 如何加载带有跑马灯进度条的表单?

multithreading - JavaFx ProgressBar 不更新

c# - Lambda表达式问题

c# - 向 AutoFixture 提供真实的 AutoMapper 实例

javascript - 等待 promise 从父函数解析

c# - Windows 7 任务栏中的跑马灯进度条

c# - 如何使用 C# 访问 Visual Studio 中图片框中的图像名称

C# 类命名约定 : Is it BaseClass or ClassBase or AbstractClass