问题描述
如下代码:publicclassForm1:System.Windows.Forms.Form{privateSystem.Windows.Forms.Buttonbutton1;privateSystem.Windows.Forms.Timertimer1;privateSystem.Windows.Forms.Timertimer2;privateinttest1=0;privateinttest2=0;privatevoidForm1_Load(objectsender,System.EventArgse){timer2.Interval=30000;timer2.Enabled=true;}privatevoidbutton1_Click(objectsender,System.EventArgse){timer1.Interval=1000;timer1.Enabled=true;}privatevoidtimer1_Tick(objectsender,System.EventArgse){Thread.Sleep(3000);test1++;timer2.Enabled=false;test2++;if(test1!=test2){timer1.Enabled=false;MessageBox.Show("test1!=test2!!!");}}}在窗体中按下button1后,触发timer1_Tick事件,然后会出现消息提示MessageBox.Show("test1!=test2!!!");(当前test1=2,test2=1).过几秒后设置断点观察test1和test2的值发现test1=test2=2.个人理解是第一次timer1_Tick触发后运行到语句"timer2.Enabled=false;"时当前处理事件中断,程序运行到第二次触发的timer1_Tick事件,然后显示消息提示,过段时间后又会继续第一次timer1_Tick事件未完成的事件处理代码.因此很难控制一些成员变量的值,请问如何避免这样的问题?
解决方案
解决方案二:
看不懂你这个程序....timer2是废的吗....
解决方案三:
timer2没做啥事,问题是在timer1_Tick中将它false后出现.
解决方案四:
看不懂你这个程序
解决方案五:
在Timer中使用Messagebox这类停止线程的函数,存在着打乱程序理想执行顺序的危险,建议你使用一个Label来观察,对于定时器最好也不要使用调试,因为象System.Timer.Timer或System.Thread.Timer都是独立线程的timer,调试时会打乱线程的执行顺序.
解决方案六:
多谢各位的回复,我使用的System.Windows.Forms.Timer类的控件,不知道会不会存在多线程的问题?将MessageBox消息提示框改为打印出test1,test2的值也不行,之前出现提示框的时候也没有使用过调试(正常运行应该不会有该提示框).对于这个Timer控件的实现机制很不明白,请问有这方面的资料吗?我实验过将timer1.Interval改为大于3000(timer1_Tick中Thread.Sleep的时间),则不会出现这个问题以及提示框.认为出现问题那次是在Thread.Sleep中又触发一次timer1_Tick事件,之后可能由于语句timer2.Enabled=false;造成的线程混乱就很不明白.