6

我有一个简单的表单,上面有 2 个进度条和 1 个后台工作人员。我有 2 个循环(一个在另一个循环中),一旦增加,我想报告每个循环的进度。这是我的代码:

private void buttonStart_Click(object sender, EventArgs e)
{
    workerCustomers.RunWorkerAsync();
}

private void workerCustomers_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    progressBar1.Value = e.ProgressPercentage;
    progressBar2.Value = (int)e.UserState;
}

private void workerCustomers_DoWork(object sender, DoWorkEventArgs e)
{
    for (int customer = 0; customer < 50; customer++)
    {
        int customerPercentage = ++customer * 100 / 50;
        workerCustomers.ReportProgress(customerPercentage, 0);

        for (int location = 0; location < 500; location++)
        {
            int locationPercentage = ++location * 100 / 500;
            workerCustomers.ReportProgress(customerPercentage, locationPercentage);
        }

        workerCustomers.ReportProgress(customerPercentage, 0);
    }
}

当程序运行时,progressbar1 会更新得很好,但progressbar2 永远不会移动。如果我通过调试器运行它,我可以看到progressbar2 的值正在改变,只是图形上没有变化。有任何想法吗?

4

3 回答 3

6

是的,如果您在桌面上启用了 Aero,第二个进度条将无法更新。它提供了动画进度条,默认情况下是绿色的,带有旅行高亮笔记。

这种进度条样式很特殊,它插入中间值并且总是看起来很平滑,即使您将课程值分配给 Value 属性也是如此。换句话说,您可以分配 10、20、30 等,但条不会跳。它平滑地增加了杆的长度。

这有副作用。要使此动画正常工作,进度条必须滞后。换句话说,它总是显示一个低于编程值的值。并且必须经过一段时间才能将条形长度平滑地增加到编程值。

您需要了解的另一个细节:当您减小Value 属性时,不会发生此动画,它会立即跳过条形长度。

所以问题是您正在以非常高的速率更新 Value 属性,比条形插入的速度要快得多。它永远赶不上。除非您在 0 处重新开始,否则会立即跳杆。比率如此之高,以至于动画永远无法达到 1。

您可以通过在内部循环中插入以下语句来看到这一点:

   System.Threading.Thread.Sleep(1);

使用参数值,您可能需要将其增加到 16 才能看到任何差异。你做得越高,通过插值使酒吧越远。

这当然不是一个真正的问题,这是因为您的工人没有做任何真正的工作。一旦您开始编写此 BGW 应该执行的实际代码,您还将降低调用 ProgressChanged 的​​速率。

于 2012-10-25T11:08:18.567 回答
1

问题在于您的内部循环非常紧凑,以至于 gui 更新过于频繁地发布,以至于 gui 无法准确响应它们。解决方案是将您的实际工作添加到内部循环中,因此需要更长的时间,或者如果您想模拟 GUI,您可以添加一个Thread.Sleep(100)来模拟需要一些时间的工作。

还要确保您的进度条最大值设置为 100,因为这是您为每个返回的最大值。

于 2012-10-25T10:51:42.730 回答
0

您的主要问题来自太快的内部循环,这意味着您实际上无法看到进度,因为更新太快以至于进度条无法处理。

您的代码行:

location * 100 / 500 

当您完成内部循环时将等于 100,因此将进度条最大值设置为 500 与该数字关系不大。这意味着您的进度条永远不会达到最大值。

于 2012-10-25T11:26:13.070 回答