Индикатор прогресса C # не обновляется при загрузке - PullRequest
0 голосов
/ 21 мая 2018

Я загружаю файл с ftp-сервера с помощью BackgroundWorker, но прогресс обновляется только после завершения загрузки файла.

Индикатор выполнения остается на 0, останавливается на время загрузки и устанавливается на 100.

Вот мой код:

    private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) {
        FtpWebRequest request = (FtpWebRequest)WebRequest.Create(activeDownload.ftpPath);
        request.Credentials = new NetworkCredential(ftpUser, ftpPass);
        request.Method = WebRequestMethods.Ftp.DownloadFile;

        FtpWebResponse response = (FtpWebResponse)request.GetResponse();
        Stream responseStream = response.GetResponseStream();

        using (FileStream writer = new FileStream(activeDownload.localPath, FileMode.Create)) {

            long length = response.ContentLength;
            int bufferSize = 2048;
            int readCount;
            byte[] buffer = new byte[2048];
            long bytesread = 0;
            backgroundWorker1.ReportProgress(0);

            readCount = responseStream.Read(buffer, 0, bufferSize);
            while (readCount > 0) {
                bytesread += readCount;
                writer.Write(buffer, 0, readCount);
                backgroundWorker1.ReportProgress((int)(bytesread / activeDownload.fileSize) * 100);
                readCount = responseStream.Read(buffer, 0, bufferSize);
            }
        }

        response.Close();
        responseStream.Close();
    }

    private void backgroundWorker1_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e) {
        progressBar1.Value = e.ProgressPercentage;
    }

Что я делаю не так?Любая помощь будет оценена.

Ответы [ 3 ]

0 голосов
/ 21 мая 2018

посмотрите, помогут ли следующие ссылки:

из стека и MSDN

Ниже приведен пример кода, который я реализовал в одном из моихпроекты:

public ProcessFilesClass()
    {
        InitializeComponent();
        backgroundWorker1= new BackgroundWorker();
        backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
        backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
        backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
    }

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker worker = sender as BackgroundWorker;
        var backgroundWorker = sender as BackgroundWorker;
        worker.WorkerReportsProgress = true;
        WorkerProcessMethod();
    }

private void WorkerProcessMethod()
    {
            //Process items in list box
            int itemsToProcess = someListBox.Items.Count;
            for (int i = 0; i < itemsToProcess; i++)
                {
                    int findPercentage = ((i + 1) * 100) / someListBox.Items.Count;
                     if (backgroundWorker1 != null) { backgroundWorker1.ReportProgress(findPercentage, null); }
                }
    }

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
           progressBar1.Value = e.ProgressPercentage;

    }

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
          //DisableProgressBarStatus
           this.Close();            
    }
0 голосов
/ 21 мая 2018

Хорошо, так получилось, что я все делал нормально, но неправильно разбирал процент.Деление двух длинных (bytesread и activeDownload.fileSize) возвращало 0. Следовательно, прогресс застрял на 0%.

Вот правильный синтаксический анализ:

backgroundWorker1.ReportProgress(Convert.ToInt32((((double)bytesread / activeDownload.fileSize) * 100)));
0 голосов
/ 21 мая 2018

Установите значение, затем запустите ниже

progressbar1.PerformStep()

Вы также можете сделать

progressBar1.Refresh()
...