我想制作一个按钮来执行某些操作,然后让用户知道它已完成。我试着用一个标签和一个按钮,然后暂停,然后让它消失。
private void button1_Click(object sender, EventArgs e)
{
// some action
label1.Text = "Done!";
System.Threading.Thread.Sleep(500);
label1.Text = "";
}
但它不起作用。我的错是什么?
答案 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)的间隔,它会在射击前等待大约半秒钟。