【问题标题】:Progress bar and file loading进度条和文件加载
【发布时间】:2012-09-16 05:39:27
【问题描述】:

我有一个很大的text file,其中包含大量数据行。在我的应用程序中,我打开此文件,通过匹配正则表达式读取每一行并将其显示在 Datagridview 中。生成的总行数约为 2000(有时甚至更多,非常大)。

因此,所有这些操作都需要相当长的时间。所以我使用后台工作人员将此代码移到另一个线程中,一切都很好,除了我想在我失败的进度条中显示加载状态。

我使用FileInfo 类来获取文件长度,然后将此值赋予Progressbar.Maximum。似乎不是正确的方法,因为包含“3”行的测试文件返回的文件长度为“305”。我不明白我应该以这种方式给出多少步间隔。

代码示例:

FileInfo ff = new FileInfo(openFileDialog1.FileName);
int fsize= Convert.ToInt32(ff.Length);
int val=1;
pgbar_load.Invoke(new MethodInvoker(delegate { pgbar_load.Maximum = fsize; }));

在循环中:

++val;
wk.ReportProgress(val);

然后:

private void bgwrkr_load_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
   pgbar_load.Value = e.ProgressPercentage;
}

所以我正在寻找两件事:

  1. 设置进度条的最大值。
  2. 正确设置步长索引。

请建议我前进的方法。

【问题讨论】:

    标签: c# file progress-bar backgroundworker


    【解决方案1】:

    将 Progressbar.Maximum 保持在 100。然后在 int 变量中跟踪您读取的数据。在 UI 线程上运行一个循环(您可以使用计时器来执行此操作),通过检查您的读取字节来设置进度条百分比的值。例如。假设您将读取的字节存储在 int totalRead;int totalFileSize 包含文件的大小。

    myProgressBar.Value = Convert.ToInt32(Math.Ceil(100d * totalRead/totalFileSize));
    

    你可以把它放在你的计时器滴答事件处理程序中。这将使进度条逐渐运行到 100%。文件读取完成后,禁用计时器。

    【讨论】:

    • 如何每次读取总读取字节数,我的意思是 int totalRead 值?问题是起初我读取了所有文件并将数据存储在通用列表中。然后在一个循环中,我更新数据网格的每一行显示进度。
    • 你可以看看我在做什么的问题中添加的代码。
    • 对这个答案的编辑很少会给出结果--- totalReadtotalFilesize 应该是 double 值,因为如果它们是整数,结果总是为零(一种类型将结果转换为整数)和 100d*0=0。还有它的Math.Ceiling( );
    • 谢谢。我已经删除了除法的括号,它现在应该是非整数除法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-27
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多