我有一个包含大量数据行的大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;
}
我正在寻找两件事:
请建议我前进的方法。
答案 0 :(得分:7)
将Progressbar.Maximum保持为100.然后在int变量中跟踪读取数据。在UI线程上运行循环(您可以使用计时器执行此操作),通过检查读取的字节来设置进度条百分比的值。例如。假设您将读取的字节存储在int totalRead;
中,int totalFileSize
包含文件大小。
myProgressBar.Value = Convert.ToInt32(Math.Ceil(100d * totalRead/totalFileSize));
您可以将它放在计时器刻度事件处理程序中。这将逐步将进度条运行到100%。文件读取完成后,禁用计时器。