Timer.Stop()有效而Timer.Start()无效???求解答

leafmao 2012-11-08 09:57:53
用的是System.Windows.Form命名空间里的计时器
代码如下:
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
timer1.Stop();//为什么Stop之后,无法用start启动??
timer1.Start();
.........
}

本来计时器是可以正常工作的,一旦接收到数据,执行了timer1.Stop之后,计时器就无法工作了,即使加入了timer1.Start也不行,谁能告诉我这是为什么啊?

如果删除timer1.Stop,计时器是可以正常工作的,这是为哪般啊,难道在接收事件里,timer1.Stop是有效的,但是timer.Start是无效的???

PS:我知道用委托是不会出现问题的,只是想知道为什么这样做,会导致stop有效而start无效
...全文
1613 43 打赏 收藏 转发到动态 举报
写回复
用AI写文章
43 条回复
切换为时间正序
请发表友善的回复…
发表回复
予乐 2013-01-24
  • 打赏
  • 举报
回复
问题很简单啦,你的串口接收开启了一个子线程,在子线程里面调用了主线程的资源,当然不能运行啦。 建议用Thread
yvhk1212 2012-11-09
  • 打赏
  • 举报
回复
使用这个timer1.Enabled=true开启false关闭
嘶吼的蚂蚁 2012-11-08
  • 打赏
  • 举报
回复
没有完整的代码段,就这两行代码。很难叫人帮你找到错误的!~
leafmao 2012-11-08
  • 打赏
  • 举报
回复
引用 12 楼 zdx0702 的回复:
http://social.msdn.microsoft.com/Forums/ro-RO/vbasiczhchs/thread/1e159d8b-8369-4526-9149-e34d09e5d16d 刚才没理解,需要对你有帮助
看了你给的链接,那人遇到的问题跟我一眼个,不过那里的答案也没有解决问题,还是没有解答为什么在dataReceived事件里只能用stop关闭计时器不能用start开启(当然用委托是可以正常关闭和开启的)。 不过谢谢啦~
leafmao 2012-11-08
  • 打赏
  • 举报
回复
引用 4 楼 51Crack 的回复:
你的Timer干嘛用的?!
计时,从发出数据开始计时,超过时间没收到对方的响应就提示超时。 但现在发现在DataReceived事件里,用stop可以将计时器停止,但是用start无法重启计时器。用ENABELD属性也是一样,false可以关闭,但是true不能开启
zdx0702 2012-11-08
  • 打赏
  • 举报
回复
字能打错,
zdx0702 2012-11-08
  • 打赏
  • 举报
回复
http://social.msdn.microsoft.com/Forums/ro-RO/vbasiczhchs/thread/1e159d8b-8369-4526-9149-e34d09e5d16d 刚才没理解,需要对你有帮助
leafmao 2012-11-08
  • 打赏
  • 举报
回复
引用 9 楼 libinguest 的回复:
注意流程,接收到数据停止后,启用时间的代码是否执行了。设断点调试一下。
都试过了,断点调试也试过了,明明在断点调试里发现timer.enabled为true,计时器就是无法工作呀。 只要我将接收事件里的timer.stop删除,计时器就可以正常工作,但是加入了stop,哪怕紧接着写start,计时器也无法工作。 为啥在接收事件里,stop会让计时器停止工作,而start无法开启计时器呢
leafmao 2012-11-08
  • 打赏
  • 举报
回复
引用 6 楼 zdx0702 的回复:
private void timer1_Tick(object sender, EventArgs e) { this.textBox1.Text = DateTime.Now.ToString(); } private void button1_Click(object sender, EventArgs e) ……
我知道这样可以。。。。 囧,我的问题是,为什么在dataReceived事件里stop有效而start有效,这是有个前提的,在接收事件里
风之影子 2012-11-08
  • 打赏
  • 举报
回复
注意流程,接收到数据停止后,启用时间的代码是否执行了。设断点调试一下。
leafmao 2012-11-08
  • 打赏
  • 举报
回复
引用 5 楼 chenandczh 的回复:
1.你的定时器执行的时间间隔长短 2.串口数据接收的时间频度
定时器定的是100毫秒的 经试验,不管串口接收的频率是多高,只要有数据过来,只要第一次执行了timer1.stop,计时器就停止工作了,我想问的是为什么stop会导致计时器停止工作,但是start却无法开启,在程序的其它地方先stop后start是没有问题的,但是在接收事件里怎么写就会出问题。问题已经描述过了,stop有效而start无效
风之影子 2012-11-08
  • 打赏
  • 举报
回复
接收数据事件停止时间控件运行。 数据处理结束事件或方法是启用,启用的时候用Enabled=true
zdx0702 2012-11-08
  • 打赏
  • 举报
回复
private void timer1_Tick(object sender, EventArgs e) { this.textBox1.Text = DateTime.Now.ToString(); } private void button1_Click(object sender, EventArgs e) { if (this.timer1.Enabled) { this.timer1.Enabled = false; } else { this.timer1.Interval = 1000; this.timer1.Enabled = true; } } timer1.Enabled=true开启,false停止,可以的呀;
绿领巾童鞋 2012-11-08
  • 打赏
  • 举报
回复
1.你的定时器执行的时间间隔长短 2.串口数据接收的时间频度
51Crack 2012-11-08
  • 打赏
  • 举报
回复
你的Timer干嘛用的?!
leafmao 2012-11-08
  • 打赏
  • 举报
回复
引用 2 楼 zdx0702 的回复:
使用这个timer1.Enabled=true开启false关闭
试过了,一样的问题,使用了timer1.Enabled=false后,计时器停止工作,再使用timer1.Enabled=true无法开启计时器。。。 为啥在接收事件里只能停止计时器无法开启计时器呢?
zdx0702 2012-11-08
  • 打赏
  • 举报
回复
使用这个timer1.Enabled=true开启false关闭
leafmao 2012-11-08
  • 打赏
  • 举报
回复
求大神解答啊。。。调试了好久发现了问题,却不知道问题的原因,纠结啊
leafmao 2012-11-08
  • 打赏
  • 举报
回复
引用 37 楼 hhddzz 的回复:
引用 33 楼 leafmao 的回复: 引用 31 楼 hhddzz 的回复:原因就是你错误的使用了它。 winform控件不是线程安全的,对多线程环境下的表现和行为不做保证。或许在某些情况下它可以正常工作;或许在另外一些情况下不能正常工作——一切都听天由命,控件自身不在这些方面做任何特殊处理。 或许在这里不能stop了,在另外一个地方不能start了,在别的什么地方interval又异常……
谢谢,顿时释然了,纠结了一天多的问题,弄不明白脸上都冒痘痘了。。。如你所言,错误使用导致其内部机制出问题而停止工作
leafmao 2012-11-08
  • 打赏
  • 举报
回复
引用 36 楼 jason173 的回复:
timer1.Start();是很定有效的,当计时器开始计时后要过100毫秒才能触发,但是在这段时间内,串口接收事件就触发了,这样还没到计时器触发的时间又相当于重新初始化了下计时器,它又要过100毫秒,这样反复。给你的感觉好像是timer1.Start();没有效果。
不是你说的这样的。。。我在回帖里又详细描述了问题
加载更多回复(23)

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧