我有一个非常简单的应用程序,它将具有数千行的excel文件加载到DataGridView组件中。然后,通过按下“扫描”按钮,对该表进行重复和其他各种问题的扫描。我选择让此繁重的任务在BackgroundWorker中运行,以便UI保持响应状态,因此我可以报告其进度。我的“扫描”按钮的代码仅调用后台工作程序组件上的RunWorkerAsync()方法,然后执行此操作:
Scanner scanner = new Scanner(this, dgvScancodes, dgvErroredScancodes, BgwScanner);
这会调用另一个类来完成实际工作,将扫描仪作为参数传递。然后,Scanner类执行此操作:
foreach (DataGridViewRow row in table.Rows)
{
//Long computations on each row
worker.ReportProgress(row.Index / table.RowCount * 100);
}
扫描执行得很好,并产生了预期的输出,但是我的ProgressBar从未在BackgroundWorker的ProgressChanged事件上使用以下代码进行更新:
private void BgwScanner_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
pgbProgress.Value = e.ProgressPercentage;
}
认为这可能与我计算百分比的方式有关,我替换了对ReportProgress的调用,只是发送了一个值50以查看会发生什么。进度条不会更新,但仅在整个扫描完成时才更新!没有异常引发,它的行为就像UI线程忙于做其他事情(除了循环遍历表中的每一行外,据我所知)。知道为什么我会看到这种行为吗?
对于整数除法,该值朝零舍入到下一个最接近的整数。在您的情况下,由于row.index可能介于0和table.RowCount-1之间,因此在乘以100之前,它将始终始终精确地向零舍入。
完全冗长:
row.Index / table.RowCount * 100
可能成为:
(int)(((double)row.Index / (double)table.RowCount) * 100)