使文本显示在按钮下半秒钟

时间:2015-05-31 20:31:38

标签: c# winforms button label

我想制作一个按钮来执行某些操作,然后让用户知道它已完成。我试着用一个标签和一个按钮,然后暂停,然后让它消失。

private void button1_Click(object sender, EventArgs e)
        {

            // some action 
            label1.Text = "Done!";
            System.Threading.Thread.Sleep(500);
            label1.Text = "";
        }

但它不起作用。我的错是什么?

2 个答案:

答案 0 :(得分:2)

正如格兰特在答案中所说,你正在阻止UI线程。最简单的解决方案是生成一个新的Task,它将为您执行更新,从而释放UI线程。

Task只需使用Invoke即可在Sleep之后将更新推送回UI线程。

在您的情况下,这会转换为以下内容:

private void button1_Click(object sender, EventArgs e)
{
    // some action 
    label1.Text = "Done!";
    new TaskFactory().StartNew(() =>
    {
        Thread.Sleep(5000);
        Invoke((Action)(() => label1.Text = string.Empty));
    });
}

答案 1 :(得分:1)

Thread.Sleep()的调用会冻结UI线程半秒钟,因此不会对UI进行更新(包括更新Label的文本)。

以下是几个选项:

  • 您可以使用BackgroundWorker,它具有内置机制,可以在单独的线程中执行长时间运行的代码,然后在完成后更新UI(例如您的Label)。

  • 您可以向Form添加Windows.Forms.Timer,以执行操作并更新标签。给它一个500(ms)的间隔,它会在射击前等待大约半秒钟。