C# 进度条在任务完成时更新
C# Progress Bar updates when task is complete
所以我正在开发一个下载管理器,我也实现了 pause/resume 功能。但是为了在恢复下载时获取进度条值,我还需要在下载停止之前获取文件的现有长度。像这样。
private void updateProgressBar(DownloadProgressChangedEventArgs e)
{
if (InvokeRequired)
Invoke((MethodInvoker)delegate ()
{
updateProgressBar(e);
});
else
{
downloadProgressBar.Value = Convert.ToInt32((e.BytesReceived + existFileSize)/(e.TotalBytesToReceive + existFileSize)*100);
}
}
其中 existFileSize 是暂停后现有文件的大小。但由于某种原因,进度条只会在下载完成后更新。但是,如果我要说的话,
downloadProgressBar.Value = e.ProgressPercentage;
这行与上一行不同,它工作得很好,但没有给出我想要的结果。
如有任何帮助或建议,我们将不胜感激。
您似乎在进行整数运算。当你计算
(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,然后再除以接收总数。
希望对您有所帮助
我认为你的除法 (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);
所以我正在开发一个下载管理器,我也实现了 pause/resume 功能。但是为了在恢复下载时获取进度条值,我还需要在下载停止之前获取文件的现有长度。像这样。
private void updateProgressBar(DownloadProgressChangedEventArgs e)
{
if (InvokeRequired)
Invoke((MethodInvoker)delegate ()
{
updateProgressBar(e);
});
else
{
downloadProgressBar.Value = Convert.ToInt32((e.BytesReceived + existFileSize)/(e.TotalBytesToReceive + existFileSize)*100);
}
}
其中 existFileSize 是暂停后现有文件的大小。但由于某种原因,进度条只会在下载完成后更新。但是,如果我要说的话,
downloadProgressBar.Value = e.ProgressPercentage;
这行与上一行不同,它工作得很好,但没有给出我想要的结果。
如有任何帮助或建议,我们将不胜感激。
您似乎在进行整数运算。当你计算
(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,然后再除以接收总数。
希望对您有所帮助
我认为你的除法 (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);