如何制作一个以编程方式重做事件的计时器
本文关键字:事件 计时器 重做 方式 何制作 一个以 编程 | 更新日期: 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.Timer
的Elapsed
事件中非法访问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
就足够了