使用计时器向表单添加控件

Adding controls to form using timers

所以我正在尝试向表单添加控件,并且我正在使用一种解决方法,以便我可以通过静态函数添加控件,我是这样做的:

Control c = this;
Button b = new Button();
//....
c.Controls.Add(b);

这个可行,所以我一直用这个方法添加控件。但是现在我正在使用定时器,但它不起作用

Control c = this;
Timer t = new Timer(500);
t.Elapsed += new ElapsedEventHandler(t_Elapsed);


public static void t_Elapsed(object sender, ElapsedEventArgs e)
{
Button b = new Button();
//...
c.Controls.Add(b);
}

函数t_Elapsed是运行,那里的代码正在执行,但是c.Controls.Add(b)行没有执行。

您的代码存在一些问题:

  1. 为什么要使用静态事件处理程序,然后使用变通方法访问实例变量,而您本来可以首先使用非静态事件处理程序?

  2. 您使用的计时器 class 是 System.Timers.Timer,还有几个不同的计时器 class,它们的行为略有不同。可以找到比较 here

当您以任何方式修改 UI 时,您必须从 UI 线程进行修改。 System.Timers.Timer 可以 调用 UI 线程上的事件处理程序,但前提是您提供同步对象,该对象是实现 ISynchronizeInvoke 的任何对象接口,例如Form.

您可以使用 t.SynchronizingObject = this 设置同步对象,如果 this 引用 Form class.

的实例

您必须在创建它们的线程上访问控件。

您的计时器已用事件在与 UI 不同的线程上触发,因此您需要将调用编组到 UI 线程。

这可以用Invoke来完成:

    void t_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        this.BeginInvoke((Action)delegate
        {
            Button b = new Button();
            c.Controls.Add(b);
        });
    }