C#提高文件处理的Progressbar准确性

C#提高文件处理的Progressbar准确性,c#,progress-bar,C#,Progress Bar,在我的代码中,我正在处理大量的文件,并试图在我的应用程序中实现更精确的进度显示。由于文件大小差异很大(1-250MB),因此处理时间也不尽相同,因此仅使用已处理文件的计数器并不能准确表示进度 progress?.Report((i+1) * 100 / total); 相反,我用这种方法研究了文件大小的分解: progress?.Report(pb.Value + (int)(update.Size * 100 / totalSize)); 但是,完成后,progressbar未满,我认为这

在我的代码中,我正在处理大量的文件,并试图在我的应用程序中实现更精确的进度显示。由于文件大小差异很大(1-250MB),因此处理时间也不尽相同,因此仅使用已处理文件的计数器并不能准确表示进度

progress?.Report((i+1) * 100 / total);
相反,我用这种方法研究了文件大小的分解:

progress?.Report(pb.Value + (int)(update.Size * 100 / totalSize));
但是,完成后,progressbar未满,我认为这是由于分区中的精度损失

我的totalSize变量可以超过2147483647字节,因此我不能只将progressbar最大值设置为total size,然后按文件大小递增该值


有没有一个简单的方法可以做到这一点?我能想到的唯一方法是在完成最后一个元素后将progressbar值设置为100%,但如果可能的话,我希望避免这样做。谢谢

在您当前的设计中,可以改进的地方很少,以提高精度:

我的totalSize变量可以超过2147483647字节,因此我不能只将progressbar最大值设置为total size,然后按文件大小递增该值

  • 使用
    long
    数据类型而不是
    int
    。这样,您就可以存储数据的实际大小。进度条本身不需要如此精确,但是:

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

  • 最后,

  • 但是,完成后,progressbar并没有满,我想是的 由于分区中的精度损失

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

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

  • 另外,另一个可能的原因是舍入在某个地方出错,因此它给出了舍入值,这有点像
    99/100
    。为了避免这种情况,我建议在
    progress.Value=N中的最终表示之前,使用
    double
    而不是整数类型来处理数据分配发生。你也可以考虑使用<代码>数学。循环< /代码>如果<代码>双< /代码>精度仍然会给你非常小的错误。这里最重要的是进行良好的调试以找出原因,然后我们可以应用适当的修复

  • 或者也可能是由于上述综合原因,您必须应用这两种修复


  • 在您当前的设计中,可以改进的地方很少,以提高精度:

    我的totalSize变量可以超过2147483647字节,因此我不能只将progressbar最大值设置为total size,然后按文件大小递增该值

  • 使用
    long
    数据类型而不是
    int
    。这样,您就可以存储数据的实际大小。进度条本身不需要如此精确,但是:

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

  • 最后,

  • 但是,完成后,progressbar并没有满,我想是的 由于分区中的精度损失

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

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

  • 另外,另一个可能的原因是舍入在某个地方出错,因此它给出了舍入值,这有点像
    99/100
    。为了避免这种情况,我建议在
    progress.Value=N中的最终表示之前,使用
    double
    而不是整数类型来处理数据分配发生。你也可以考虑使用<代码>数学。循环< /代码>如果<代码>双< /代码>精度仍然会给你非常小的错误。这里最重要的是进行良好的调试以找出原因,然后我们可以应用适当的修复

  • 或者也可能是由于上述综合原因,您必须应用这两种修复


  • 你认为你能给我们看处理文件的代码吗?你认为你能给我们看处理文件的代码吗?伊恩,我真的很抱歉,我花了这么长时间才回复你。我不记得收到过你回复的通知。非常感谢您的回复,您提出了一些非常好的建议。我目前手头没有该源代码,但我会在可能的时候尝试一下。@tom982很高兴它能帮上忙!;)没问题。伊恩,我真的很抱歉花了这么长时间才回复你。我不记得收到过你回复的通知。非常感谢您的回复,您提出了一些非常好的建议。我目前手头没有该源代码,但我会在可能的时候尝试一下。@tom982很高兴它能帮上忙!;)没问题。