4

我有以下代码:

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

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

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

4

4 回答 4

5

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

于 2012-12-06T16:39:37.293 回答
4

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

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

尝试

   Hide();
if(a > b)
{
    label.Text = "a is greater than b";
    Show();
    System.Windows.Forms.Application.DoEvents();
    Thread.Sleep(50000);
}
于 2012-12-06T16:43:40.413 回答
3

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

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

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

于 2012-12-06T16:31:44.977 回答
0

避免在 UI 类中暂停线程。您想要的最后一件事是无响应的界面!

于 2012-12-06T16:39:47.617 回答