【问题标题】:C# Progress bar doesn't update while downloadingC# 进度条在下载时不更新
【发布时间】:2018-05-21 16:48:05
【问题描述】:

我正在使用 BackgroundWorker 从 ftp 服务器下载文件,但只有在文件下载完成后进度才会更新。

进度条保持在 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;
    }

我做错了什么?任何帮助将不胜感激。

【问题讨论】:

  • 你能说一下这是一个什么样的项目,好吗?某些项目(例如 VSTO)与 BGW 的行为不符,需要额外的功能才能使其正常工作
  • 那么您是否调试过您提供给ReportProgress 的信息或进度条渲染问题?添加一些Debug.WriteLine。 + 我们需要minimal reproducible example
  • 我已经找到了解决方案。更多详情如下。

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


【解决方案1】:

设置值,然后在下面运行

progressbar1.PerformStep()

你也可以这样做

progressBar1.Refresh()

【讨论】:

    【解决方案2】:

    看看以下链接是否有帮助:

    From StackMSDN

    以下是我在其中一个项目中实现的示例代码:

    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();            
        }
    

    【讨论】:

      【解决方案3】:

      好吧,事实证明我做的一切都很好,但是我解析了错误的百分比。除以两个 long(bytesread 和 activeDownload.fileSize)返回 0。因此,进度卡在 0%。

      下面是正确的解析:

      backgroundWorker1.ReportProgress(Convert.ToInt32((((double)bytesread / activeDownload.fileSize) * 100)));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-16
        • 2020-12-18
        相关资源
        最近更新 更多