gpt4 book ai didi

c# - BackgroundWorker 中仅更新了 2 个进度条中的 1 个

转载 作者:太空狗 更新时间:2023-10-29 23:09:08 32 4
gpt4 key购买 nike

我有一个简单的表单,上面有 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 的值正在改变,只是图形上没有变化。有什么想法吗?

最佳答案

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

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

这有副作用。要使此动画有效,进度条必须滞后。换句话说,它总是显示一个落后于编程值的值。它必须经过一些时间才能顺利地将条形长度增加到编程值。

您需要了解的更多细节:当您减少 Value 属性时,此动画不会发生,它会立即跳转栏的长度。

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

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

   System.Threading.Thread.Sleep(1);

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

这当然不是真正的问题,发生这种情况是因为您的 worker 没有做任何实际工作。一旦您开始编写此 BGW 应该执行的实际代码,您也会降低调用 ProgressChanged 的​​速率。

关于c# - BackgroundWorker 中仅更新了 2 个进度条中的 1 个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13066306/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com