求助:使用System.Windows.Forms.Timer类遇到的奇怪问题

问题描述

如下代码: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;造成的线程混乱就很不明白.

时间: 2024-10-26 04:52:53

求助:使用System.Windows.Forms.Timer类遇到的奇怪问题的相关文章

System.Windows.Forms.Timer与System.Timers.Timer的区别

.NET Framework里面提供了三种Timer: System.Windows.Forms.Timer System.Timers.Timer System.Threading.Timer VS.Net 2005默认只有一个Timer控件,但那是System.Forms.Timer控件.如果要使用System.Timers.Timer的控件,需要在工具箱上单击右键,手动添加. 添加的步骤:工具箱单击右键->Add Item->找到命名空间是System.Timers.Timer的控件,将

无法创建抽象类或接口“System.Windows.Forms.DataGridViewCell”的实例?

问题描述 introw=dataGridView1.CurrentCell.RowIndex;dataGridView1.CurrentCell=newDataGridViewCell(row+1,0);if(this.ds.HasChanges){}无法创建抽象类或接口"System.Windows.Forms.DataGridViewCell"的实例无法将方法组"HasChanges"转换为非委托类型"bool".您是要调用方法吗?这两个问题

System.Windows.Forms.TabControl控件的示例

发现学生们特别喜欢用TabControl控件,问过之后才知道,原来他们觉得这个控件看上去比较酷,难怪现在标签式浏览器这么受欢迎.既然喜欢,咱就投其所好,赶紧做了一点教学示例. 这里演示了TabControl的常用事件:SelectedIndexChanged Sub TabControl1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TabControl1.Sel

无法将类型为“System.Windows.Forms.BindingSource”的对象强制转换为类型“System.Data.DataTable”

问题描述 c#无法将类型为"System.Windows.Forms.BindingSource"的对象强制转换为类型"System.Data.DataTable"代码:System.Data.DataTabledataSource=newSystem.Data.DataTable();if(base.DataSourceisDataView){dataSource=((DataView)base.DataSource).ToTable();}else{dataSo

c#-C#报错“System.Windows.Forms.ListView”不包含“SubItems”的定义

问题描述 C#报错"System.Windows.Forms.ListView"不包含"SubItems"的定义 错误 1 "System.Windows.Forms.ListView"不包含"SubItems"的定义,并且找不到可接受类型为"System.Windows.Forms.ListView"的第一个参数的扩展方法"SubItems"(是否缺少 using 指令或程序集引用?)

vista下System.Windows.Forms.SendKeys.Send事件没有权限

问题描述 在xp和03下System.Windows.Forms.SendKeys.Send("{tab}")执行通过并运行正确.但在vista下却抱错,提示为"应用程序试图执行安全策略不允许的操作"有人知道怎么改策略么? 解决方案 解决方案二:vista估计用的人很少吧.顶一下,解决方案三:客户那边有一台机器是vista的,运行出错..郁闷的.

在 System.ArgumentException 中第一次偶然出现的“System.Windows.Forms.dll”类型的异常

问题描述 我是开发的winform应用程序,开发的时候控件库用了devexpress控件,另外使用了一个只支持单线程的ocx控件[VG]用来绘图,我在程序中对ocx控件进行封装,重新封装成一个control,然后在主界面中使用,现在的问题是,我在这界面调用控件的绘图方法,本身程序没报错,但是就不绘图,然后我设置断点调试,居然发现又可以绘图,然后我调出VS的输出窗口,发现问题了,就在不设置断点的情况下,发下每当执行绘图操作的时候,输出窗口都会报如下错误:在System.ArgumentExcept

【C#遗补】获取应用程序路径之System.IO.Directory.GetCurrentDirectory和System.Windows.Forms.Application.StartupPath的区别

原文:[C#遗补]获取应用程序路径之System.IO.Directory.GetCurrentDirectory和System.Windows.Forms.Application.StartupPath的区别 .Net Framework中,System.IO.Directory.GetCurrentDirectory()方法用于获得应用程序当前工作目录 如果使用此方法获得应用程序所在的目录,应该注意:System.IO.Directory.GetCurrentDirectory()方法获得的

System.Windows.Forms.AxHost.InvalidActiveXStateException”类型的异常在 ESRI.ArcGIS.AxControls.dll 中发生,但未在用户代码中进行处理

private void CopyAndOverwriteMap() { //IObjectCopy接口变量申明 IObjectCopy objectCopy = new ObjectCopyClass(); //要Copy的对象 object toCopyMap = m_mapControl.Map; //复制要复制的对象 object copiedMap = objectCopy.Copy(toCopyMap); //要复制到的文件 object toOverwriteMap = axPag