程序下载文件时ProgressBar出现问题

时间:2012-10-19 12:44:11

标签: c# .net asynchronous download progress-bar

我遇到一个简单的更新程序问题。它应该下载存档并提取它。嗯,这很好用。但我无法克服进度条。 它显示在setProgressBar(progressBar1.Maximum / 20)很好。 但它的价值的所有其他变化根本没有显示。我无法定义此行为的原因。有谁可以帮助我?

UPD:在下载完成之前,似乎e.ProgressPercentage总是返回0,只返回100。

这是我的代码:

static EventWaitHandle _waitHandle = new AutoResetEvent(false);

void UpdaterForm_Shown(object sender, System.EventArgs e)
{
    setProgressBar(progressBar1.Maximum/20);

    UpdateProgram(address, login, password);

    setProgressBar(progressBar1.Maximum);

    ExecuteProgram(Path + "../" + programName + ".exe");

    Application.Exit();     
}

private void UpdateProgram(string pathToUpdateArchive, string login, string pass)
{
    string downloadedArchive = null;

    Thread downloadAsync = new Thread(() => DownloadFileFromFtp(pathToUpdateArchive, login, pass, out downloadedArchive));
    downloadAsync.Name = "downloadAsync";
    downloadAsync.Start();

    _waitHandle.WaitOne();

    ExtractFile(downloadedArchive, Path + "/../");
}

private void DownloadFileFromFtp(string address, string login, string password, out string archivePath)
{
    fileName = address.Substring(address.LastIndexOf('/') + 1);

    try
    {
        WebClient wc = new WebClient();
        wc.Credentials = new NetworkCredential(login, password);

        wc.DownloadProgressChanged += new DownloadProgressChangedEventHandler(wc_DownloadProgressChanged);
        wc.DownloadFileCompleted += new System.ComponentModel.AsyncCompletedEventHandler(wc_DownloadFileCompleted);     

        archivePath =Path + fileName;
        wc.DownloadFileAsync(new Uri(address), archivePath);
    }
    catch
    {
    }
}

void wc_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
    setProgressBar(e.ProgressPercentage*7/10 + 10);
}

void wc_DownloadFileCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
{
    _waitHandle.Set();
}

private void setProgressBar(int value)
{
    if (progressBar1.InvokeRequired)
        this.BeginInvoke((MethodInvoker)delegate { progressBar1.Value = value; });
    else
        progressBar1.Value = value;
}

0 个答案:

没有答案