C#-BackgroundWorker仅在完成时报告进度

问题描述 投票:0回答:1

我有一个非常简单的应用程序,它将具有数千行的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线程忙于做其他事情(除了循环遍历表中的每一行外,据我所知)。知道为什么我会看到这种行为吗?

c# datagridview progress-bar backgroundworker
1个回答
0
投票

对于整数除法,该值朝零舍入到下一个最接近的整数。在您的情况下,由于row.index可能介于0和table.RowCount-1之间,因此在乘以100之前,它将始终始终精确地向零舍入。

完全冗长:

row.Index / table.RowCount * 100

可能成为:

(int)(((double)row.Index / (double)table.RowCount) * 100)
© www.soinside.com 2019 - 2024. All rights reserved.