如何在 C# 中设置代码行之间的延迟
本文关键字:之间 延迟 代码 设置 | 更新日期: 2023-09-27 18:36:16
我是c#的新手,我正在使用Windows表单。
我有 3 buttons
form1
.我正在尝试设置 3 个按钮,以便在表单加载时/之后它们一个接一个地显示。我使用了以下代码,但是当我运行程序时它不起作用,同时出现了3个按钮
private void MainForm_Load(object sender, EventArgs e)
{ //Hide all buttons
button1.Visible = false;
button2.Visible = false;
button3.Visible = false;
Thread.Sleep(500);
//show buttons one by one
button1.Visible = true;
Thread.Sleep(500);
button2.Visible = true;
Thread.Sleep(500);
button3.Visible = true;
}
我不知道我做错了什么。谁能帮我如何在表单加载时/之后使 3 个按钮一个接一个地显示。我很高兴收到任何其他想法.谢谢
您使用 Thread.Sleep 阻止了 UI 线程,并且更新未反映出来。
你能做的最好的事情就是创建一个异步函数并使用 Task.Delay,这样线程仍然会响应,您将看到更新:
private async void MainForm_Load(object sender, EventArgs e)
{ //Hide all buttons
button1.Visible = false;
button2.Visible = false;
button3.Visible = false;
await Task.Delay(500);
//show buttons one by one
button1.Visible = true;
await Task.Delay(500);
button2.Visible = true;
await Task.Delay(500);
button3.Visible = true;
}
这里的主要问题是在呈现表单之前调用 Load。这一点,再加上 Thread.Sleep 阻止当前 (UI) 线程的事实,导致按钮在窗体实际呈现之前全部可见。
可以通过使用 Form.Shown
事件并使暂停异步来解决此问题。
private async void Shown(Object sender, EventArgs e) {
var buttons = new[] {button1, button2, button3};
foreach (var button in buttons)
{
await Task.Delay(TimeSpan.FromMilliseconds(500));
button.Visible = true;
}
}
确保您的按钮仍以Visible = false;
启动
像
您一样Form_Load事件中将所有按钮的可见设置为 False。
创建一个具有所需间隔和一些计数器的计时器。
在 Timer.Tick 事件中,根据计数器值逐个设置按钮的可见性,如下所示:
switch(counter)
{
case 0: button1.Visible = true; break;
case 1: button2.Visible = true; break;
case 2: button3.Visible = true; break;
}
counter++;
然后,当所有按钮都可见时,禁用计时器。
button1.Visible = false;
button2.Visible = false;
Task.Factory.StartNew(() =>
{
Thread.Sleep(2000);
this.Invoke((MethodInvoker)delegate { button1.Visible = true; });
Thread.Sleep(2000);
this.Invoke((MethodInvoker)delegate { button2.Visible = true; });
});