任务完成后,C#Progress Bar会更新

时间:2018-01-30 20:01:24

标签: c# progress-bar webclient

所以我正在开发一个下载管理器,我也实现了暂停/恢复功能。但是为了在下载恢复时获取进度条值,我需要在下载停止之前获取文件的现有长度。这样的事情。

    private void updateProgressBar(DownloadProgressChangedEventArgs e)
    {
        if (InvokeRequired)
            Invoke((MethodInvoker)delegate ()
            {
                updateProgressBar(e);
            });
        else
        {
            downloadProgressBar.Value = Convert.ToInt32((e.BytesReceived + existFileSize)/(e.TotalBytesToReceive + existFileSize)*100);
        }
    }

其中existsFileSize是暂停后现有文件的大小。但由于某种原因,进度条仅在下载完成后才会更新。但是,如果我要说,让我们说,

    downloadProgressBar.Value = e.ProgressPercentage;

这不是前一行,而是完美运行,但不会给出我想要的结果。

任何帮助或建议都将不胜感激。

2 个答案:

答案 0 :(得分:0)

看起来你正在执行整数运算。当你计算

(e.BytesReceived + existFileSize)/(e.TotalBytesToReceive + existFileSize)

此计算的结果是一个整数,0或1.因此,您的进度条从0跳到100,并且不能介于两者之间。

尝试将上面的部分更改为:

(e.BytesReceived + existFileSize)/(double)(e.TotalBytesToReceive + existFileSize)

这将使计算结果成为一个浮点值,然后给出一个在0到100之间变化的值。

修改

实际上,更有效的方法是:

downloadProgressBar.Value = Convert.ToInt32( (e.BytesReceived + existFileSize) * 100 / (e.TotalBytesToReceive + existFileSize));

请注意,它现在乘以100除以之前除以接收的总数。

希望这有帮助

答案 1 :(得分:0)

我认为你的分区(e.BytesReceived + existFileSize)/(e.TotalBytesToReceive + existFileSize)可能将整数除以整数,这将给出整数结果。由于(e.BytesReceived + existFileSize)将小于(e.TotalBytesToReceive + existFileSize),因此您获得的结果将始终为0.

而是将这些值转换为浮点数,以便结果也是浮点数。

downloadProgressBar.Value = Convert.ToInt32((float)(e.BytesReceived + existFileSize)/(float)(e.TotalBytesToReceive + existFileSize)*100);