如何在 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 个按钮一个接一个地显示。我很高兴收到任何其他想法.谢谢

如何在 C# 中设置代码行之间的延迟

您使用 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; });
            });