我有一个程序,我想显示一个文本,等待2秒,然后退出。当我运行它时,它等待两秒钟然后退出,但不显示文本。
代码:
if (userNumber == selectedNumber)
{
userMSGLabel.Text = "You guessed the correct number. Program is exiting";
userMSGLabel.BackColor = Color.LightGreen;
System.Threading.Thread.Sleep(2000);
Environment.Exit(-1);
}
有什么想法吗?
答案 0 :(得分:4)
我认为你的Thread.Sleep(2000)
阻止了UI线程。请尝试
private void Form1_Load(object sender, EventArgs e)
{
label1.Text = "You guessed the correct number. Program is exiting";
label1.BackColor = Color.LightGreen;
Task.Factory.StartNew(Sleep).ContinueWith(t => Exit());
}
private void Sleep()
{
Thread.Sleep(2000);
}
private void Exit()
{
Environment.Exit(-1);
}
答案 1 :(得分:0)
尝试使用计时器而不是thread.sleep。我无法从您的代码中说出来,但您可能在GUI线程中,这会阻止重新绘制屏幕。
答案 2 :(得分:0)
Thread.Sleep
在指定时间内阻止当前线程,并且您位于UI线程中,该线程用于更新标签。更改此设置的最简单方法可能是添加一个定时器控件(您似乎使用Windows窗体),其Interval
为2000:
private void CloseTimer_Tick(object sender, EventArgs e) {
Environment.Exit(-1); // Can’t you just use Close() or something?
}
而不是睡觉和退出,
CloseTimer.Start();
通常,您还可以通过其他几种方式启动另一个线程,包括但不限于:
使用完整主题:
Thread t = new Thread(delegate {
Thread.Sleep(2000);
Environment.Exit(-1);
});
t.Start();
使用任务,如@Max所写;这是特别好的
使用Application.DoEvents
(但不要;它是邪恶的,你的UI仍然会锁定,只需要一个正确的标签;在循环中执行它是多余的;使用其他一个东西)
答案 3 :(得分:-1)
您可以使用Application.DoEvents()
请求Windows重新标记您的标签。
if (userNumber == selectedNumber)
{
userMSGLabel.Text = "You guessed the correct number. Program is exiting";
userMSGLabel.BackColor = Color.LightGreen;
Application.DoEvents();
System.Threading.Thread.Sleep(2000);
Environment.Exit(-1);
}