一尘不染

如何在C#中实现进度条?

c#

如何在C#中为数据库调用实现进度条和backgroundworker?

我确实有一些处理大量数据的方法。它们是运行时间相对较长的操作,因此我想实现一个进度条,以使用户知道实际发生的事情。

我曾考虑过使用进度条或状态条标签,但是由于只有一个UI线程,因此执行数据库处理方法的线程不会更新UI控件,这使进度条或状态条标签对我毫无用处。

我已经看过一些示例,但是它们处理for循环,例如:

for(int i = 0; i < count; i++)
{ 
    System.Threading.Thread.Sleep(70);
    // ... do analysis ...
    bgWorker.ReportProgress((100 * i) / count);
}

private void bgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    progressBar.Value = Math.Min(e.ProgressPercentage, 100);
}

我正在寻找更好的例子。


阅读 778

收藏
2020-05-19

共1个答案

一尘不染

有些人可能不喜欢它,但这是我要做的:

private void StartBackgroundWork() {
    if (Application.RenderWithVisualStyles)
        progressBar.Style = ProgressBarStyle.Marquee;
    else {
        progressBar.Style = ProgressBarStyle.Continuous;
        progressBar.Maximum = 100;
        progressBar.Value = 0;
        timer.Enabled = true;
    }
    backgroundWorker.RunWorkerAsync();
}

private void timer_Tick(object sender, EventArgs e) {
    if (progressBar.Value < progressBar.Maximum)
        progressBar.Increment(5);
    else
        progressBar.Value = progressBar.Minimum;
}

选取框样式要求启用VisualStyles,但是它可以连续滚动而不需要更新。我将其用于不报告进度的数据库操作。

2020-05-19