请问如何才能彻底结束System.Timers.Timer

howze 2015-02-09 04:58:55
由于业务需要,用了个计时器
使用的是System.Timers.Timer

其他一些设置相关的就不写了,
主要使用方式如下:

//声明一个atimer
System.Timers.Timer atimer = new System.Timers.Timer();
//定时执行test方法
atimer.Elapsed += new System.Timers.ElapsedEventHandler(test);


按照这个写法,假设我定时每10秒执行一次,也就是每10秒派出一个atimer去帮我打探消息(执行test方法),打探完以后回来给我报告。
但是打探消息(执行test方法)需要15秒,那么就会出现一种情况,当第一个atimer派出去以后,过了十秒,消息还没打探回来呢,第二个atimer就又被派出去了,这时候,如果第一个atimer打探的结果是我想要的,那我就想彻底结束所有的atmer,第二个被派出去的atimer我就不想让他回来了,这个该怎么实现呢?我用了stop或者设置enabled=false,但是这些只能结束我当前的这个atimer,不能结束别的已经派出去的atimer,我想要结束所有的。
...全文
559 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
於黾 2015-02-10
  • 打赏
  • 举报
回复
话说,派出多个探子,明显是多余的 第一个探子没回来,你再派出一个,第二个也不会比第一个先回来 你应该在第一个回来之前,不要派出下一个,除非它死在了外面,你确定它不会回来了
  • 打赏
  • 举报
回复
引用 楼主 howze 的回复:
但是这些只能结束我当前的这个atimer,不能结束别的已经派出去的atimer,我想要结束所有的。
派出去多个探子,无意义。 如果一个探子第19秒钟回来了,另一个探子第20秒钟回来了,这显然就是多余的。
  • 打赏
  • 举报
回复
在你的 test 方法里,第一句话写
atimer.Stop();
最后一句话才写
atimer.Start();
实际上这是逻辑上的“懒惰”造成的。 如果是正规的逻辑设计,可能会说“如果派出的一个探子用了3秒钟打探来消息,那么就把下一个Interval设置为7秒钟;如果用了1秒钟,那么就设置为9秒钟;如果用了15秒,那么还是设置为10秒钟——最多10秒钟。” 或者是别的逻辑流程也可以。总之是更加具体地设计“可执行的”流程,而不是纠结“对错”问题。
CGabriel 2015-02-10
  • 打赏
  • 举报
回复
换一个 timer System.Windows.Forms.Timer
howze 2015-02-09
  • 打赏
  • 举报
回复
引用 5 楼 Z65443344 的回复:
你一个一个循环添加的,当然也要一个一个循环结束 哪里有"一次性结束全部atimer"这种东西 就是想图省事,你不如执行Application.Restart(),那么保证你创建的所有对象都重新初始化了
非常感谢,我试试您的思路,放到集合里试试看,感谢!
於黾 2015-02-09
  • 打赏
  • 举报
回复
你一个一个循环添加的,当然也要一个一个循环结束 哪里有"一次性结束全部atimer"这种东西 就是想图省事,你不如执行Application.Restart(),那么保证你创建的所有对象都重新初始化了
howze 2015-02-09
  • 打赏
  • 举报
回复
至于您说的放到集合里我循环结束我倒是没试过 不知道有没有什么办法能一次性结束全部atimer呢
howze 2015-02-09
  • 打赏
  • 举报
回复
引用 2 楼 Z65443344 的回复:
想彻底丢弃,还应该先执行 atimer.Elapsed -= new System.Timers.ElapsedEventHandler(test); 然后再 atimer.Stop(); atimer.Dispose();
您好,我就是先执行atimer.Elapsed -= new System.Timers.ElapsedEventHandler(test); 后执行的atimer.Stop();atimer.Dispose(); 但是结束不了其他产生的atimer
於黾 2015-02-09
  • 打赏
  • 举报
回复
想彻底丢弃,还应该先执行 atimer.Elapsed -= new System.Timers.ElapsedEventHandler(test); 然后再 atimer.Stop(); atimer.Dispose();
於黾 2015-02-09
  • 打赏
  • 举报
回复
System.Timers.Timer对象new完放List<System.Timers.Timer>里,然后循环将它们全部结束 不要每次new完就丢弃句柄,那样回头再找就不好找了(虽然还有遍历控件的方式,不过比较麻烦)

110,556

社区成员

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

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

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