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%,但如果可能的话,我想避免这样做。谢谢

C# 提高了文件处理的进度条准确性

在当前的设计中,可以改进的地方很少,以表示更好的准确性:

我的 totalSize 变量可以超过 2147483647 个字节,所以我不能只将进度条最大值设置为总大小并按文件大小递增该值。

  1. 使用long数据类型而不是int 。这样,您可以存储数据的实际大小。进度条本身不需要像这样准确,但是:

    progress?.Report(pb.Value + (int)(update.Size * 100 / totalSize)); //note 100
    
  2. 实际上,您可以通过将其progress.Maximum调整为更高(例如,progress.Maximum = 1000,然后每个progress.Value计为总数的 0.1%)来提高进度条的准确性,这将使您比默认进度条设置的精度高 10 倍,前提是您的 GUI 支持此类像素精度。

  3. 最后

但是,完成后,进度条没有满,我认为这是 由于分区精度的损失。

这可能是由于上述原因,或者...

  1. 这可能是由于图形表示。由于更新进度条图形需要一点延迟。您可能已经完成了流程并为进度条赋予了正确的值(如果您使用我的答案,则为 100/100 或 1000/1000),但 UI 尚未更新。如果您想延迟一点,只需使用 Thread.Sleep .

  2. 此外,另一个可能的原因是四舍五入在某处搞砸了,因此它为您提供了四舍五入的值,这有点像99/100。为了防止这种情况,我建议在赋值中的最终表示发生之前使用 double 而不是整数类型处理数据progress.Value = N;。如果精度仍然double误差很小,您也可以考虑使用 Math.Round。这里重要的是良好的调试以隔离原因,然后我们可以应用适当的修复程序。

  3. 或者也可能是由于上述综合原因,您必须应用两个修复程序。