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

时间:2016-02-25 18:25:12

标签: c# winforms

我是c#的新手,我使用的是Windows窗体。

form1有3 buttons。我正在尝试设置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个按钮。我很高兴收到任何其他想法。谢谢

4 个答案:

答案 0 :(得分:6)

您正在使用Thread.Sleep阻止UI线程,并且没有反映更新。

您可以做的最好的事情是创建一个异步函数并使用Task.Delay,这样线程仍然会响应,您将看到更新:

42h

答案 1 :(得分:4)

这里的主要问题是在呈现表单之前调用Load。这与Thread.Sleep阻塞当前(UI)线程的事实相结合,导致在窗体实际呈现之前所有按钮都可见。

您可以使用temp.txt事件并使暂停异步来解决此问题。

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; } }

启动

答案 2 :(得分:1)

在Form_Load事件中将所有按钮的Visible设置为False。
创建一个具有所需间隔和一些计数器的计时器。
在Timer.Tick事件中,根据计数器值逐个设置按钮的可见性,如下所示:

switch(counter)
{
  case 0:  button1.Visible = true; break;
  case 1:  button2.Visible = true; break;
  case 2:  button3.Visible = true; break;
}
counter++;

然后,当所有按钮都可见时,请禁用计时器。

答案 3 :(得分:0)

            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; });
            });