今天遇到一个奇怪的问题,一个节目中,设置了两个渠道启动计时器( Forms.Timer),其中一个渠道计时器正常工作,另一个渠道计时器不工作。
//按钮btnBedIn绑定的事件
private void bedIn(object sender, EventArgs e)
{
//...
timerTotalTime.Start();
}
//在独立线程中调用(无效,timer不工作)
bedIn(null, null);
渠道1:(正常)点击界面上的一个按钮btnBedIn,在这个按钮绑定的事件 bedIn(object sender, EventArgs e) 中启动计时器。
渠道2:(无效)网络端口收到数据后,在一个 独立线程 中直接调用 bedIn(null, null) 。
经过一番测试,发现了原因,因为Forms.Timer是基于UI线程的,所以在独立线程中直接调用bedIn()方法无效。
解决的办法:
在独立线程中,改用按钮的performClick()方法:
btnBedIn.Invoke((MethodInvoker)delegate
{
btnBedIn.PerformClick();
});
用了PerformClick()方法之后,就又回到了UI线程中的点击方法,计时器能够正常工作了。
问题解决。