【问题标题】:Winform label text not showingWinform标签文本不显示
【发布时间】:2012-12-07 00:51:50
【问题描述】:

我有以下代码:

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

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

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

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

    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

    【讨论】:

    • 在这种情况下任务是什么? C# 不识别 Task 和 TaskScheduler?我是否遗漏了一些 using 语句?
    【解决方案2】:

    如上所说,是因为休眠了,UI还没来得及更新呢。

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

    试试

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

    【讨论】:

    • 不要使用 DoEvents... 正如经常提到的那样,不推荐使用 DoEvents。
    【解决方案3】:

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

    您需要做的是启动一个 50 秒后经过的计时器,并在计时器的代码中隐藏表单。

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

    【讨论】:

    • 其实这段代码已经在定时器事件中了。那么有没有更好的方法来做到这一点?
    【解决方案4】:

    避免在 UI 类中暂停线程。您最不想要的就是无响应的界面!

    【讨论】:

      猜你喜欢
      • 2015-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多