UI进度条错误C#

时间:2012-11-26 21:22:06

标签: c# winforms progress-bar backgroundworker

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

我有一个从0到100的循环(或循环),只报告他的进度,然后睡100ms:

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

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

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

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

但问题是,listBox1已经更新,但GUI在进度条更新之前会休眠5秒。 (因此该计划在5秒内坚持49%和99%。)

问题:我可以采取措施解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

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

要强制进度条更新,请致电Invalidate()Update()。例如:

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

编辑(@Servy评论的澄清):

为了清楚起见,我在上面提供了两种选择。解决问题的首选方法是删除UI线程中的Sleep(),然后让后台线程负责在适当的时间“暂停”。在UI线程中调用Invalidate()之前使用Update()Sleep()的第二种方法可能适用于此特定实例,但实际上是一种黑客攻击,并且不会很好地保留维护立场(即,容易在未来的代码更改中中断),并且还具有其他不期望的属性。如果可能的话,请使用第一种方法。