首页 > 解决方案 > DownloadProgressChanged 仅在文件下载后调用

问题描述

我试图使用进度条来跟踪我的下载,唯一的问题是进度值仅在文件下载到计算机后而不是在下载过程中发生变化。

这是我的代码,任何帮助将不胜感激。

public void DownloadZaq()
    {

        using (WebClient zaq = new WebClient())
        {
            zaq.DownloadProgressChanged += new DownloadProgressChangedEventHandler(Zaq_DownloadProgressChanged);
            zaq.DownloadFileCompleted += new AsyncCompletedEventHandler(Zaq_DownloadFileCompleted);
            zaq.DownloadFileAsync(new Uri(http://example.com), @"c:\to\111.jpg");
        }
    }


    public void Zaq_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
    {
        MessageBox.Show("download completed");
    }

    public void Zaq_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
    {
        progressBar1.Value = e.ProgressPercentage;
    }

标签: c#

解决方案


我认为 DownloadFileAsync 在检查 DNS 时会以某种方式阻塞主线程。这就是我会尝试的

WebClient zaq;
public void DownloadZaq()
{
  zaq = new WebClient();
  zaq.DownloadProgressChanged += new DownloadProgressChangedEventHandler(Zaq_DownloadProgressChanged);
  zaq.DownloadFileCompleted += new AsyncCompletedEventHandler(Zaq_DownloadFileCompleted);
  System.Threading.Tasks.Task.Run(() => // Workaround to allow Async call
  {
    try
    {
      zaq.DownloadFileAsync(new Uri(http://example.com), @"c:\to\111.jpg");
    }
    catch (Exception ex)
    {
      zag.Dispose();
    }
  });
}

public void Zaq_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
{
  MessageBox.Show("download completed");
  zag.Dispose();
}

public void Zaq_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
  progressBar1.Value = e.ProgressPercentage;
}

推荐阅读