C# 提高了文件处理的进度条准确性
本文关键字:准确性 处理 文件 | 更新日期: 2023-09-27 18:31:29
在我的代码中,我正在处理大量文件,并且我正在尝试在我的应用程序中实现更准确的进度显示。由于文件的大小变化很大(1-250MB),因此处理时间很长,因此仅使用已处理文件的计数器并不能准确表示进度。
progress?.Report((i+1) * 100 / total);
相反,我用这种方法考虑了文件大小:
progress?.Report(pb.Value + (int)(update.Size * 100 / totalSize));
但是,完成后,进度条没有满,我认为这是由于除法精度的损失。
我的 totalSize 变量可以超过 2147483647 个字节,所以我不能只将进度条最大值设置为总大小并按文件大小递增该值。
有没有简单的方法可以做到这一点?我能想到的唯一方法是在最后一个元素完成后将进度条值设置为 100%,但如果可能的话,我想避免这样做。谢谢
在当前的设计中,可以改进的地方很少,以表示更好的准确性:
我的 totalSize 变量可以超过 2147483647 个字节,所以我不能只将进度条最大值设置为总大小并按文件大小递增该值。
-
使用
long
数据类型而不是int
。这样,您可以存储数据的实际大小。进度条本身不需要像这样准确,但是:progress?.Report(pb.Value + (int)(update.Size * 100 / totalSize)); //note 100
-
实际上,您可以通过将其
progress.Maximum
调整为更高(例如,progress.Maximum = 1000
,然后每个progress.Value
计为总数的 0.1%)来提高进度条的准确性,这将使您比默认进度条设置的精度高 10 倍,前提是您的 GUI 支持此类像素精度。 -
最后
但是,完成后,进度条没有满,我认为这是 由于分区精度的损失。
这可能是由于上述原因,或者...
-
这可能是由于图形表示。由于更新进度条图形需要一点延迟。您可能已经完成了流程并为进度条赋予了正确的值(如果您使用我的答案,则为 100/100 或 1000/1000),但 UI 尚未更新。如果您想延迟一点,只需使用
Thread.Sleep
. -
此外,另一个可能的原因是四舍五入在某处搞砸了,因此它为您提供了四舍五入的值,这有点像
99/100
。为了防止这种情况,我建议在赋值中的最终表示发生之前使用double
而不是整数类型处理数据progress.Value = N;
。如果精度仍然double
误差很小,您也可以考虑使用Math.Round
。这里重要的是良好的调试以隔离原因,然后我们可以应用适当的修复程序。 -
或者也可能是由于上述综合原因,您必须应用两个修复程序。