如何制作一个以编程方式重做事件的计时器

本文关键字:事件 计时器 重做 方式 何制作 一个以 编程 | 更新日期: 2023-09-27 18:29:30

所以我想每隔10秒点击一次按钮,下面是我的代码:

using System;
using System.Timers;
public class Main : Form {
    public Main() {        
        InitializeComponent();
        // add timer to do button clicking every 10 seconds
        double elapse = 10000;
        System.Timers.Timer timer2 = new Time(elapse);
        timer2.Elapsed += new ElapsedEventHandler(ResetEvent);
        timer2.AutoReset = true;
        timer2.Start();
    }
    private void ResetEvent(object source, ElapsedEventArgs e) {
        try {
            Refresh_Button.PerformClick();
            Process_Button.PerformClick();
        } catch { }
    }
    private void Refresh_Button_Click(object sender, EventArgs e) {
        // some code
    }  
    private void Process_Button_Click(object sender, EventArgs e) {
        // some code
    }
}

然而,它不起作用。代码有什么问题吗?我怎样才能让它发挥作用?

如何制作一个以编程方式重做事件的计时器

问题是在System.Timers.TimerElapsed事件中非法访问UI线程。

您正在计时器的Elapsed事件中调用Refresh_Button.PerformClick();,该事件导致您正在隐藏的跨线程异常。

访问UI thtread并调用Refresh_Button:的PerformClick()方法

Refresh_Button.Invoke(new Action(() => { Refresh_Button.PerformClick(); }));

您也可以使用System.Windows.Forms.Timer来处理Tick事件并手动调用Refresh_Button.PerformClick();

注意:

  • 不要隐藏异常。如果你隐藏异常,这样的问题就会隐藏起来,而且很难找到它们
  • 最好将逻辑放在一个方法中,而不是调用PerformClick,而是调用该方法
  • 如果你不需要不同的线程,System.Windows.Forms.Timer就足够了