C# 在按钮上设置计时器

C# 在按钮上设置计时器,c#,C#,我已经动态创建了一些按钮,现在我想一个接一个地显示所有这些按钮。 如何使用延迟功能。我使用thread.sleep循环。但是所有的按钮都会延迟,但我想每个按钮都会延迟。我正在使用C#visual studio 2012 for (int i = 0; i < 10; i++) { btn[i] = new Button(); btn[i].Text = i.ToString(); btn[i].Click += Form1_Click;

我已经动态创建了一些按钮,现在我想一个接一个地显示所有这些按钮。 如何使用延迟功能。我使用thread.sleep循环。但是所有的按钮都会延迟,但我想每个按钮都会延迟。我正在使用C#visual studio 2012

for (int i = 0; i < 10; i++)
{               
   btn[i] = new Button();
   btn[i].Text = i.ToString();
   btn[i].Click += Form1_Click;
   this.flowLayoutPanel1.Controls.Add(btn[i]);
   System.Threading.Thread.Sleep(1000);
}  //closing of code 
for(int i=0;i<10;i++)
{               
btn[i]=新按钮();
btn[i].Text=i.ToString();
btn[i]。单击+=表格1\u单击;
this.flowLayoutPanel1.Controls.Add(btn[i]);
系统线程线程睡眠(1000);
}//关闭代码

您当前正在阻止UI线程-不要这样做

相反,我建议你使用计时器。例如:

class Foo : Form
{
    private int nextButtonToShow = 0;
    private Timer timer;
    private Button[] buttons;

    internal Foo()
    {
        timer = new Timer();
        timer.Tick += ShowNextButton;
        timer.Interval = 1000;
        timer.Enabled = true;
    }

    private void ShowNextButton(object sender, EventArgs e)
    {
        // TODO: Set location etc
        Button button = new Button { Text = nextButtonToShow.ToString() };
        button.Click += ...;
        buttons[i] = button;
        Controls.Add(button);
        nextButtonToShow++;
        if (nextButtonToShow == buttons.Length)
        {
            timer.Enabled = false;
        }
    }
}

(您应该确保在处理表单时也处理了计时器。)

我会使用Microsoft的反应式框架(在NuGet上查找Rx Main)

不要在主UI线程上使用Thread.Sleep(),否则会阻止窗口中的事件和刷新。使用一个计时器控件代替一个间隔,在计时器的滴答声事件中处理添加一个按钮,在下一个事件中引发下一个按钮,依此类推。
var addButtons =
    Observable
        .Interval(TimeSpan.FromSeconds(1.0))
        .Take(10)
        .ObserveOn(SynchronizationContext.Current);

addButtons.Subscribe(i =>
{
    btn[i] = new Button();
    btn[i].Text = i.ToString();
    btn[i].Click += Form1_Click;
    this.flowLayoutPanel1.Controls.Add(btn[i]);
});