请教:所谓的线程定时器(System.Timers.Timer)用法

Gujianda 2020-08-11 09:22:29
最近因为想提高点定时精度,依葫芦画瓢地用了几个“线程定时器(System.Timers.Timer)”。
简单测试发现:无论设置Enable=false,还是调用Stop()、Close()方法,都是迫使定时器"停止"并"清零";
然后无论设置Enable=true,还是调用Start(),都是从头开始。我原以为Stop()方法类似"暂停"。
果然如此吗?
...全文
1932 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
wanghui0380 2020-08-12
  • 打赏
  • 举报
回复
至于你说的重新计时的问题。 实际上你的要求我们都直接拿Environment.TickCount 的,包括我上面说我想生成一个方波,我们也只是需要线程里不停循环拿tick带入三角函数里计算
wanghui0380 2020-08-12
  • 打赏
  • 举报
回复
我个人认为于其纠结所谓的timer,不如直接做个“信号发生器” 正常情况,你这类要求我们当做“方波信号发生器”,俺们压根不管啥停止不停止,高位做事,低位不做
天明月圆 2020-08-12
  • 打赏
  • 举报
回复
看楼主的意思是在定时器绑定函数里对定时器进行启动停止操作。正常情况应该是按照楼主的描述执行的。可以将你的业务抽象成一个简单的例子把代码贴出来吗?然后让大家帮忙看看
Gujianda 2020-08-12
  • 打赏
  • 举报
回复
上面最后一句()里应该是:(Enable=false)。
另外补充:但如果达到终值后,调用Close()方法则可以停止!
Gujianda 2020-08-12
  • 打赏
  • 举报
回复
楼上的Z467057213c,谢谢!
我需要的任务是:执行固定次数的重复操作(发令、配合切换相关电路)。
我目前的做法是:①实例化这个时钟时,设置为单次执行(AutoReset=false)
②在定时器绑定的触发事件中,(先干事)判步骤号,小于终值就再次使能这个定时器、达到终值就不再激活。。。
结果,诡异的是:达到终值后(Enablekending=false了),不断地重新进入触发事件。。。根本停不下来!
z467057213c 2020-08-12
  • 打赏
  • 举报
回复
首先明白一点,System.Timers.Timer启动的机制,都是设置Enabled=true或false来控制启动停止,即便是Start,Stop,也只是封装了对于Enabled属性的控制,还有Close是释放计时器线程所占据的资源。另外需要注意一点,这个定时器是多线程定时器,意味着只要时间间隔到了就会执行既定动作,而不会管你上次的动作执行完没,例如设置时间间隔100ms,但是你的处理动作需要处理10s,显然在这个时间间隔内是处理不完的,下次动作会直接处理,而非等待上次的完成在延缓时间,所以也就不存在暂停这个问题。
github_36000833 2020-08-12
  • 打赏
  • 举报
回复
从你说的"暂停"上看,可能你需要一个计时器,而不是定时器。 计时器可以用System.Diagnostics.Stopwatch, 用Stopwatch计时, 用Timer来每秒显示计时结果。
Gujianda 2020-08-12
  • 打赏
  • 举报
回复
@z467057213c,你说到的“...还有Close是释放计时器线程所占据的资源”,这话在我的实验中没见痕迹。
因为无论属性"Ebabled=false"还是"方法Stop()"、"方法Close"停止计时后,都能用属性Enabled=true重新启动。
八爻老骥 2020-08-11
  • 打赏
  • 举报
回复
那就取更小的tick值,自己累加啊。

110,536

社区成员

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

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

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