【问题标题】:Progress getting incorrect value from backgroundworker从后台工作人员获取不正确值的进度
【发布时间】:2011-09-22 11:05:29
【问题描述】:

我是 C# 的新手,我仍在努力学习这一切。

当从 ftp 下载文件时,我已经为进度条制作了这段代码,它实际上工作得很好。但是进度值都是错误的。看起来它以某种方式是字节值。但奇怪的是,当我将值打印到屏幕上时,它会打印出正确的值。

private void frm_movie_db_Load(object sender, EventArgs e)
{
    if (!File.Exists("movies.list.gz"))
    {
        bg_worker.RunWorkerAsync();
    }
}

private void bg_worker_DoWork(object sender, DoWorkEventArgs e)
{
    string strDownloadFrom = "ftp://ftp.sunet.se/pub/tv+movies/imdb/movies.list.gz";
    string strDownloadTo = "movies.list.gz";

    try
    {
        FtpWebRequest request = (FtpWebRequest)WebRequest.Create(strDownloadFrom);

        request.Method = WebRequestMethods.Ftp.GetFileSize;
        request.Credentials = new NetworkCredential("anonymous", "");
        request.UsePassive = true;
        request.UseBinary = true;
        request.KeepAlive = true;

        Int64 intFileSize = request.GetResponse().ContentLength;
        Int64 intRunningByteTotal = 0;

        request = (FtpWebRequest)FtpWebRequest.Create(strDownloadFrom);
        request.Method = WebRequestMethods.Ftp.DownloadFile;
        request.Credentials = new NetworkCredential("anonymous", "");
        request.UsePassive = true;
        request.UseBinary = true;
        request.KeepAlive = false;

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

        Stream writer = new FileStream(strDownloadTo, FileMode.Create, FileAccess.Write, FileShare.None);
        byte[] byteBuffer = new byte[1024];

        int intByteSize = 0;
        int intProgressPct = 0;

        while ((intByteSize = reader.Read(byteBuffer, 0, byteBuffer.Length)) > 0)
        {
            if (intByteSize == 0)
            {
                intProgressPct = 100;
                bg_worker.ReportProgress(intProgressPct);
            }
            else
            {
                writer.Write(byteBuffer, 0, intByteSize);

                if (intByteSize + intRunningByteTotal <= intFileSize)
                {
                    intRunningByteTotal += intByteSize;
                    double dIndex = intRunningByteTotal;
                    double dTotal = byteBuffer.Length;
                    double dProgressPct = (double)(dIndex / dTotal);
                    intProgressPct = (int)dProgressPct;
                    bg_worker.ReportProgress(intProgressPct);
                }
            }
        }

        //reader.Close();
        //mem_stream.Close();
        //response.Close();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }
}

private void bg_worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    //pb_download_files.Value = e.ProgressPercentage;
    lbl_progress_pct.Text = e.ProgressPercentage.ToString() + "%";
}

private void bg_worker_RunWorkerComplete(object sender, RunWorkerCompletedEventArgs e)
{
    pnlProgress.Visible = false;
}

我希望有人可以帮助我解决这个问题,因为到目前为止我已经做了所有事情来解决这个问题。

最好的问候 杰斯珀

【问题讨论】:

  • 在变量名前加上它们的类型没有任何价值。阅读:stackoverflow.com/questions/111933/…
  • 不,lbl_progress_pct.Text = e.ProgressPercentage.ToString() + "%"; 没有显示正确的值。
  • 这个double dProgressPct = (double)(dIndex / dTotal);不是百分比计算。

标签: c# .net backgroundworker progress ftpwebrequest


【解决方案1】:

你在百分比进度计算上完全搞错了:perc 必须是 100 x 当前/总计,所以你使用了错误的值。

试试这个:

double dProgressPct = 100.0 * intRunningByteTotal / intFileSize;
bg_worker.ReportProgress((int)ProgressPct);

阅读Microsoft documentation

public void ReportProgress(int percentProgress)

其中 percentageProgress 是后台操作完成的百分比,从 0 到 100。

【讨论】:

  • 我认为你需要评论代码中发生的事情,这样才能更好地理解他做错了什么。无论如何都要 +1
  • 这对我有用。我的数学总是让我丧命,也许我应该努力解决这个问题:p
【解决方案2】:
double dTotal = byteBuffer.Length;

不将总字节数分配给 dTotal。 byteBuffer 是一个固定大小为 1024 字节的缓冲区。尝试类似

double dTotal = reader.Length;

检索流的长度(以字节为单位)。

【讨论】:

  • 即使有这个(这是正确的)OP 也应该始终乘以 100 以获得正确的百分比值
【解决方案3】:

你有:

double dTotal = byteBuffer.Length;
double dProgressPct = (double)(dIndex / dTotal);

我想你想要:

double dProgressPct = (double)(dIndex / intFileSize );

【讨论】:

  • 即使有这个(这是正确的)OP 也应该始终乘以 100 以获得正确的百分比值
猜你喜欢
  • 2010-10-25
  • 1970-01-01
  • 2013-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-11
  • 1970-01-01
相关资源
最近更新 更多