Winform标签文本未显示

时间:2012-12-06 16:29:54

标签: c# winforms

我有以下代码:

Hide()
if(a > b)
{
label.Text = "a is greater than b";
Show();
Thread.Sleep(50000);
}

我想要做的是在app启动后立即隐藏winform。如果在任何时候a> b,它将在标签中显示带有该消息的winform 50秒,并将再次隐藏。 label也设置为autosize = true;

以上代码有效但标签没有显示任何文字?这也是使用线程睡眠显示winfor的正确方法吗?

4 个答案:

答案 0 :(得分:4)

如上所述,这是因为睡眠,UI还没有时间更新它。

但是,您不必使用计时器。 DoEvents()给它一些时间来更新UI。

   Hide();
if(a > b)
{
    label.Text = "a is greater than b";
    Show();
    System.Windows.Forms.Application.DoEvents();
    Thread.Sleep(50000);
}

答案 1 :(得分:3)

这是因为Thread.Sleep导致应用程序暂停当前线程 - 这意味着在这50秒内,表单上没有更新。

要达到你想要的目的,你需要做的是启动50秒后经过的计时器,并在计时器的代码中隐藏表格。

计时器可以是放在表单上的Windows窗体计时器组件。

答案 2 :(得分:3)

Thorsten是对的,Sleep正在冻结UI线程,因此UI不会刷新,但你也可以做这样的事情作为一种解决方法:

Hide()
if(a > b)
{
    label.Text = "a is greater than b";
    Show();
    Refresh();
    Thread.Sleep(5000);
}

但最干净的解决方案当然是:

Hide()
if(a > b)
{
    label.Text = "a is greater than b";
    Show();
    Task.Factory
        .StartNew(() => Thread.Sleep(5000))
        .ContinueWith(() => Close(), TaskScheduler.FromCurrentSynchronizationContext());
}

但是不要忘记添加正确的using子句来使用任务并行库:

using System.Threading.Tasks;

TPL在.NET 4及更高版本中可用。更多信息:http://msdn.microsoft.com/en-us/library/dd460717.aspx

答案 3 :(得分:0)

避免在UI类中暂停线程。你想要的最后一件事是一个没有反应的界面!