1

我有一个进度条的错误,我不知道如何处理它。

我有一个从 0 到 100 的 for 循环(或循环),只报告他的进度,然后休眠 100 毫秒:

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
    for (int i = 0; i <= 100; i++)
    {
        backgroundWorker.ReportProgress(i);
        Thread.Sleep(100);
    }
}

在 progresschanged 事件处理方法中,除了一些其他的东西之外,还有两个“if”:

if (matchProgressBar.Value == 50)
{
    OnHalfTime(); //listBox1.Add("Halftime!");
}
if (matchProgressBar.Value == 100)
{
    OnFullTime(); //listBox1.Add("Full time!");
}

两个“未知”的方法是向 listBox 添加一行。在第一种情况下:“中场休息!”;在第二个中:“全职!”。在这两行之后有相同的“Thread.Sleep(5000);” //你知道,只是因为你需要在中场休息:) //

但问题是 listBox1 已经更新,但 GUI 在进度条更新之前休眠了 5 秒。(所以程序在 49% 和 99% 处停留 5 秒。)

问题:我可以做些什么来解决这个问题吗?

4

1 回答 1

1

你真的不应该Sleep()在 UI 线程中调用。考虑重新安排事情,以便您暂停然后恢复您的后台线程,如果这是意图的话。

要强制更新进度条,请调用Invalidate()Update()。例子:

matchProgressBar.Invalidate();
matchProgressBar.Update();

编辑(澄清@Servy评论):

为了清楚起见,我在上面提供了两种选择。解决问题的首选方法是删除Sleep()UI 线程中的 ,而是让后台线程负责在适当的时间“暂停”。第二种选择,在调用 UI 线程之前使用Invalidate()和调用,可能会在这个特定实例中工作,但实际上是一个 hack,并且从维护的角度来看并不能很好地支持(即,容易因未来的代码更改而中断),并且还有其他不受欢迎的属性。如果可能,请使用第一种方法。Update()Sleep()

于 2012-11-26T21:43:34.537 回答