为什么Win Forms应用程序不会立即更新标签?

时间:2010-05-22 17:59:37

标签: c# winforms

我正在做一些线程试验,并制作了一个“控制”方法来比较UI线程中发生的所有处理。它应该运行一个方法,它将在最后更新标签。此方法运行四次,但标签在完成所有4个之前不会更新。我期望一个标签每2秒更新一次。这是代码:

private void button1_Click(object sender, EventArgs e)
{
    Stopwatch watch = new Stopwatch();
    watch.Start();

    UIThreadMethod(lblOne);
    UIThreadMethod(lblTwo);
    UIThreadMethod(lblThree);
    UIThreadMethod(lblFour);

    watch.Stop();
    lblTotal.Text = "Total Time (ms): " + watch.ElapsedMilliseconds.ToString();
}

private void UIThreadMethod(Label label)
{
    Stopwatch watch = new Stopwatch();
    watch.Start();

    for (int i = 0; i < 10; i++)
    {
        Thread.Sleep(200);
    }
    watch.Stop();

    // this doesn't set text right away 
    label.Text = "Done, Time taken (ms): " + watch.ElapsedMilliseconds;
}

也许我只是缺少一些基本的东西,但我被困住了。有任何想法吗?感谢。

2 个答案:

答案 0 :(得分:5)

您的UI线程是单个线程,而不是两个线程。要让您的UI响应,您必须将工作放在另一个线程(通常使用BackgroundWorker),或者告诉UI在UI线程中重新绘制自己。

当我做这样的事情时,我总是要做实验,但 Control.Refresh 方法应该这样做:

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.refresh.aspx

答案 1 :(得分:2)

您通过执行睡眠操作来阻止UI线程,这不会导致重绘。如果您将在另一个线程上休眠并在UI线程上调用Label更新,那么它应该按预期工作。