【问题标题】:Trying to make label display text, wait, then close the program (C#)试图让标签显示文本,等待,然后关闭程序(C#)
【发布时间】:2015-07-08 02:22:57
【问题描述】:

您好,我一直在尝试在我的程序中添加一个按钮,当您单击该按钮时,它会在标签中显示文本,等待用户阅读,然后退出程序。但是如果我运行它并尝试它,它只会等待然后退出而不显示文本。抱歉,如果这是一个不好的解释,我刚开始编码。这就是我所拥有的。

private void button3_Click(object sender, EventArgs e)
{
    label1.Text = "Text Here";
    Thread.Sleep(500);
    this.Close();
}

【问题讨论】:

    标签: c#


    【解决方案1】:

    调用label1.Invalidate() 强制重绘控件。当你调用Thread.Sleep时,UI线程会被阻塞,不会更新。

    如果这不起作用,请尝试label1.Refresh()Application.DoEvents();

    private void button3_Click(object sender, EventArgs e)
    {
        label1.Text = "Text Here";
        label1.Invalidate();
        Thread.Sleep(500);
        this.Close();
    }
    

    更理想的解决方案是使用计时器、另一个线程或某种异步事件来独立于 UI 运行代码:

    timer = new Timer();
    timer.Interval = 500;
    timer.Tick += (sender, e) => Close();
    timer.Start();
    

    new Thread(delegate() { 
        Thread.Sleep(500);
        this.Close(); 
    }).Start();
    

    还要注意,500 毫秒是一个很短的时间,你的意思是 5000 毫秒,相当于 5 秒吗?您可能还想看看Winforms: Application.Exit vs Enviroment.Exit vs Form.Close,因为Close() 关闭 当前 窗口。

    【讨论】:

      【解决方案2】:

      与其使用 Thread.Sleep 阻止 UI 线程(并阻止它随文本更新),不如保持 UI 响应。这将使 UI 保持工作并延迟然后关闭应用程序。

      private void button3_Click(object sender, EventArgs e)
      {
          label1.Text = "Text Here";
          Task.Delay(5000).ContinueWith((arg) => Application.Exit());
      }
      

      Task 在另一个线程中运行,延迟指定的毫秒(在本例中为 5000 或 5 秒),然后继续调用以关闭应用程序。

      顺便说一句,this.Close() 只有在您运行它的表单是应用程序的“初始”表单时才会关闭应用程序。如果您从另一个子窗体运行相同的代码,它只会关闭该窗体。如果您想真正关闭应用程序,最好的办法是使用Application.Close() 方法。这会优雅地关闭应用程序。如果要右下角终止,可以使用Environment.Exit(int)

      【讨论】:

        猜你喜欢
        • 2011-10-07
        • 1970-01-01
        • 2017-06-18
        • 1970-01-01
        • 2014-03-03
        • 2014-03-29
        • 1970-01-01
        • 2019-04-05
        • 1970-01-01
        相关资源
        最近更新 更多