在C#中暂停执行

时间:2014-06-13 02:43:22

标签: c#

我有一个程序,我想显示一个文本,等待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);
}

有什么想法吗?

4 个答案:

答案 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();

通常,您还可以通过其他几种方式启动另一个线程,包括但不限于:

  • Using thread pool threads

  • Using System.Timers timers

  • 使用完整主题:

    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);
}