Timer用多了好不好?

时间:2021-09-08 20:40:31
比如我一下子开个几百个 甚至上千个Timer 每个Timer的周期都不一样 干的事大体上是一样的
1:不确定Timer的效率问题?



针对上面的需求,其实我是想做一个监控数据的系统
比如表A大概每秒insert数据大概在100-10000之间
那我做一个监控,当这个表每秒进来的数据超过这个范围的时候,我就认为这个表对应的作业/任务有异常,就报警

因为不同的业务处理逻辑以及周期不一样,所以不能用统一的Timer,只能是每个逻辑(或者说每个监控)用一个自己的Timer
如果需要监控的逻辑有1000个,那就有1000个Timer
2:不知道这样做好不好?


3:如果不好,大家有什么好的建议?


多谢各位。。。





105 个解决方案

#1


自找麻烦,改用线程吧

#2


当然不好 个人觉得

#3


你想把程序搞死吧

#4


引用 1 楼  的回复:
自找麻烦,改用线程吧


用线程的sleep和while true达到Timer的效果?

#5


实在不行就用一个超小的timer,然后每个逻辑对应一个counter。

#6


补充一下 
这是个监控的系统 
要求要一直运行着 不是只跑一次

#7


尽量使用少的timer做类似的工作,尽量合并现有timer,可以提高稳定性和性能
比如一个timer的tick是5秒,另一个timer的tick是10秒
可以只使用第一个timer,在count = 2的时候,触发第二个timer应该做的事情

#8


感觉用线程比较好 Timer用多了好不好?

#9


达不到Timer的什么效果?
引用 4 楼  的回复:
引用 1 楼 的回复:

自找麻烦,改用线程吧


用线程的sleep和while true达到Timer的效果?

#10


那是你自己 找无聊吧, 

开多了 好资源的 CPU 。

#11


这种问题还是用线程来解决吧。

#12


如果要监控仪器是否正常的话不建议用Timer
1.Timer本身就不准确,不是绝对的时间定义,至于Timer的误差,没有统计数据,Timer用的越多越不准确。
2.如果仪器有应答模式,发命令,收回复就可以了确定仪器的工作状态。
3.如果仪器只是单纯上传数据,比较数据内容比用Timer更准确,也更敏感。

#13


引用 9 楼  的回复:
达不到Timer的什么效果?
引用 4 楼  的回复:
引用 1 楼 的回复:

自找麻烦,改用线程吧


用线程的sleep和while true达到Timer的效果?



呃 我不是在质疑达不到 我是确认一下1L建议用线程是不是要和Timer的效果一样
但是要比Timer要好

#14


其实很神奇的是,既然是往数据表里插入数据,记录竟然没有保存创建时间?哪需要监视呢?

#15


或者比如通过事件的方式,插入数据触发一个事件,判断两次或多次触发的间隔,就能知道频率了,哪需要定时器呢

#16


把几个不同的周期合并在一直,减少Timer数量 

#17


引用 16 楼  的回复:
把几个不同的周期合并在一直,减少Timer数量


这个可以考虑

#18


引用 14 楼  的回复:
其实很神奇的是,既然是往数据表里插入数据,记录竟然没有保存创建时间?哪需要监视呢?


是要做数据级监控 满足一定筏值条件报警 创建时间当然要有了 不然没法做监控的
处理大数据量的时候 或者是处理敏感数据的时候 肯定要有监控啊 
没有监控的项目。。。

#19


引用 15 楼  的回复:
或者比如通过事件的方式,插入数据触发一个事件,判断两次或多次触发的间隔,就能知道频率了,哪需要定时器呢



呃 是不是你理解错了。。。。
我要的不是知道频率 是要知道频率内的数据量是否符合要求 不符合要求要报警



引用 15 楼  的回复:
或者比如通过事件的方式,插入数据触发一个事件,判断两次或多次触发的间隔,就能知道频率了,哪需要定时器呢


插入数据触发事件 说的是触发器吗?
这个也不行 因为触发器是带事物的 如果在触发事件的时候出错的话 那插入的数据就有问题了

如果不是触发器的话,你说的应该是记录日志之类的操作,然后分析日志吧?这样也不行的,这样的实现方式适合类似数据分析的需求,而我说的监控肯定是实时的

#20


Timer 是在主线程中执行的,如果在Timer中执行耗时的操作,会造成界面卡死

#21


该回复于2012-10-30 08:34:12被版主删除

#22


Timer本来就是基于优先队列的,用单线程sleep要么更差(忙得来的时候),要么根本就是错误的(忙不来的时候)。

事件模式才是解决方案。

#23


1、timer只是间隔触发
2、timer的间隔不精确
3、timer的间隔跟自然时间没啥关系,比如间隔1分钟的timer,并不是在每个分钟的0秒时发生

#24


要看你用的是哪个timer。
System.Windows.Forms.Timer和System.Timers.Timer都是基于win32 waitable timer(queued timer),每个timer都会对应win32 handle,消耗windows资源。
System.Threading.Timer是轻量级的,不占用win32资源。
参考对比资料: http://msdn.microsoft.com/en-us/magazine/cc164015.aspx

timer的处理程序,就是在工作线程上跑的(除了前两种timer可以消息处理方式在UI线程上跑),所以当然也会有线程的开销。但这比始终霸占1000个线程要好多了,可以及时释放和利用线程池。

建议用system.threading.timer, .net托管时钟是高效的,1千个timer完全可以应付,你应该想办法优化timer事件处理程序(就是你的监控程序),让它们执行的时间更短。

#25


引用 24 楼  的回复:
要看你用的是哪个timer。
System.Windows.Forms.Timer和System.Timers.Timer都是基于win32 waitable timer(queued timer),每个timer都会对应win32 handle,消耗windows资源。
System.Threading.Timer是轻量级的,不占用win32资源。
参考对比资料:http://msdn.……


你的建议是用Threading.Timer,但是最好要优化一下监控程,这个要比单纯的多线程sleep要好,我理解的对不? 序 

#26


引用 24 楼  的回复:
要看你用的是哪个timer。
System.Windows.Forms.Timer和System.Timers.Timer都是基于win32 waitable timer(queued timer),每个timer都会对应win32 handle,消耗windows资源。
System.Threading.Timer是轻量级的,不占用win32资源。
参考对比资料:http://msdn.……


昨天和同事探讨的时候 还提供了一个方案
用ThreadingPool 
不知道这个和Threading.Timer比哪个更好一些?

#27


timer触发事件时,就是从thread pool里面抓线程来执行事件处理程序,.net帮你自动完成了这一过程。

#28


很神奇哦

#29


确实很神奇哦

#30


timer本来就是单线程~

#31


菜鸟的用法,必死无疑。

#32


引用 31 楼  的回复:
菜鸟的用法,必死无疑。


请大神赐教

#33


我一般是开个线程用while(1) 和sleep(10)

#34


用线程吧,timer容易死

#35


很有借鉴意义

#36


不用Timer,Timer多了的确不准确,改用“事件触发”机制吧,在事件发生的时候计数器加一即可,然后看看此时距离上一次触发事件的时间。

#37


一般来说都是需要准确计时才用timer,如果是事件触发肯定是用线程比较好。

#38


只用1个小timer多好啊

#39


http://hi.baidu.com/liuzumou/item/4571f5ca098bec1250505855
找到篇文章
是介绍System.Threading.Timer的 
这个Timer和另外两个的区别是 由线程池线程服务

原本打算直接用线程 看到这个 是不是也可以用Threading.Timer了?

#40


引用 36 楼  的回复:
不用Timer,Timer多了的确不准确,改用“事件触发”机制吧,在事件发生的时候计数器加一即可,然后看看此时距离上一次触发事件的时间。


事件触发机制不行,数据监控的意义要在于及时,如果用事件触发机制的话,如果本次数据不过来,就不会触发验证机制,达不到及时报警的效果

#41


引用 38 楼  的回复:
只用1个小timer多好啊


呃 没看懂回复。。。
 以我的需求 1个timer肯定不够用啊

#42


引用 6 楼  的回复:
补充一下 
这是个监控的系统 
要求要一直运行着 不是只跑一次

做监控系统都用timer控件吗???这样也行?  
我前几天还在改彩票出票监控系统  我是用线程实现的  每一台出票机对应一个线程 一个系统监控五十台体彩打票机 监控这五十台打票机器为兑奖票数变化和 各种彩种已下单未出票的单子数量变化

#43


引用 42 楼  的回复:
引用 6 楼  的回复:

补充一下
这是个监控的系统
要求要一直运行着 不是只跑一次

做监控系统都用timer控件吗???这样也行?  
我前几天还在改彩票出票监控系统  我是用线程实现的  每一台出票机对应一个线程 一个系统监控五十台体彩打票机 监控这五十台打票机器为兑奖票数变化和 各种彩种已下单未出票的单子数量变化



没说非要用timer,只是在讨论,你的监控频率是多少?逻辑复杂吗?机器的压力大吗?

#44


5秒刷新一次 逻辑能有多复杂啊  50个线程异步调用接口 拿数据绑定 就OK了 主要看你要做是调用接口还是查数据库了  我是用接口的 对机器没什么压力 CPU都没咋变化

#45


引用 44 楼  的回复:
5秒刷新一次 逻辑能有多复杂啊  50个线程异步调用接口 拿数据绑定 就OK了 主要看你要做是调用接口还是查数据库了  我是用接口的 对机器没什么压力 CPU都没咋变化

上图
[img=http://my.csdn.net/my/album/detail/1349362][/img]

#47


用多了timer不好,多了之后程序会变得很卡,建议使用多线程。

#48


有个简单的解决方法,仅供参考,谨慎使用:
用一个定时器,定时很短的时间,假设500毫秒
每个逻辑部分定一个时钟,从0开始计,假设A需要5秒定时,B 6秒,C7秒。
定时器每次ABC轮询一次,ABC的时钟各自累加,哪一个到达了就加到处理队列,由处理线程去做,定时器不阻塞。
典型的IM Server, Web Server等长连接轮询一般都用这种方法。

#49


这个方法的前提很明确:定时器里绝对不能阻塞,只进行时钟累加和触发事件,其他线程接到事件再做处理。

#50


引用 47 楼  的回复:
用多了timer不好,多了之后程序会变得很卡,建议使用多线程。



timer 本事就是 线程了,

#1


自找麻烦,改用线程吧

#2


当然不好 个人觉得

#3


你想把程序搞死吧

#4


引用 1 楼  的回复:
自找麻烦,改用线程吧


用线程的sleep和while true达到Timer的效果?

#5


实在不行就用一个超小的timer,然后每个逻辑对应一个counter。

#6


补充一下 
这是个监控的系统 
要求要一直运行着 不是只跑一次

#7


尽量使用少的timer做类似的工作,尽量合并现有timer,可以提高稳定性和性能
比如一个timer的tick是5秒,另一个timer的tick是10秒
可以只使用第一个timer,在count = 2的时候,触发第二个timer应该做的事情

#8


感觉用线程比较好 Timer用多了好不好?

#9


达不到Timer的什么效果?
引用 4 楼  的回复:
引用 1 楼 的回复:

自找麻烦,改用线程吧


用线程的sleep和while true达到Timer的效果?

#10


那是你自己 找无聊吧, 

开多了 好资源的 CPU 。

#11


这种问题还是用线程来解决吧。

#12


如果要监控仪器是否正常的话不建议用Timer
1.Timer本身就不准确,不是绝对的时间定义,至于Timer的误差,没有统计数据,Timer用的越多越不准确。
2.如果仪器有应答模式,发命令,收回复就可以了确定仪器的工作状态。
3.如果仪器只是单纯上传数据,比较数据内容比用Timer更准确,也更敏感。

#13


引用 9 楼  的回复:
达不到Timer的什么效果?
引用 4 楼  的回复:
引用 1 楼 的回复:

自找麻烦,改用线程吧


用线程的sleep和while true达到Timer的效果?



呃 我不是在质疑达不到 我是确认一下1L建议用线程是不是要和Timer的效果一样
但是要比Timer要好

#14


其实很神奇的是,既然是往数据表里插入数据,记录竟然没有保存创建时间?哪需要监视呢?

#15


或者比如通过事件的方式,插入数据触发一个事件,判断两次或多次触发的间隔,就能知道频率了,哪需要定时器呢

#16


把几个不同的周期合并在一直,减少Timer数量 

#17


引用 16 楼  的回复:
把几个不同的周期合并在一直,减少Timer数量


这个可以考虑

#18


引用 14 楼  的回复:
其实很神奇的是,既然是往数据表里插入数据,记录竟然没有保存创建时间?哪需要监视呢?


是要做数据级监控 满足一定筏值条件报警 创建时间当然要有了 不然没法做监控的
处理大数据量的时候 或者是处理敏感数据的时候 肯定要有监控啊 
没有监控的项目。。。

#19


引用 15 楼  的回复:
或者比如通过事件的方式,插入数据触发一个事件,判断两次或多次触发的间隔,就能知道频率了,哪需要定时器呢



呃 是不是你理解错了。。。。
我要的不是知道频率 是要知道频率内的数据量是否符合要求 不符合要求要报警



引用 15 楼  的回复:
或者比如通过事件的方式,插入数据触发一个事件,判断两次或多次触发的间隔,就能知道频率了,哪需要定时器呢


插入数据触发事件 说的是触发器吗?
这个也不行 因为触发器是带事物的 如果在触发事件的时候出错的话 那插入的数据就有问题了

如果不是触发器的话,你说的应该是记录日志之类的操作,然后分析日志吧?这样也不行的,这样的实现方式适合类似数据分析的需求,而我说的监控肯定是实时的

#20


Timer 是在主线程中执行的,如果在Timer中执行耗时的操作,会造成界面卡死

#21


该回复于2012-10-30 08:34:12被版主删除

#22


Timer本来就是基于优先队列的,用单线程sleep要么更差(忙得来的时候),要么根本就是错误的(忙不来的时候)。

事件模式才是解决方案。

#23


1、timer只是间隔触发
2、timer的间隔不精确
3、timer的间隔跟自然时间没啥关系,比如间隔1分钟的timer,并不是在每个分钟的0秒时发生

#24


要看你用的是哪个timer。
System.Windows.Forms.Timer和System.Timers.Timer都是基于win32 waitable timer(queued timer),每个timer都会对应win32 handle,消耗windows资源。
System.Threading.Timer是轻量级的,不占用win32资源。
参考对比资料: http://msdn.microsoft.com/en-us/magazine/cc164015.aspx

timer的处理程序,就是在工作线程上跑的(除了前两种timer可以消息处理方式在UI线程上跑),所以当然也会有线程的开销。但这比始终霸占1000个线程要好多了,可以及时释放和利用线程池。

建议用system.threading.timer, .net托管时钟是高效的,1千个timer完全可以应付,你应该想办法优化timer事件处理程序(就是你的监控程序),让它们执行的时间更短。

#25


引用 24 楼  的回复:
要看你用的是哪个timer。
System.Windows.Forms.Timer和System.Timers.Timer都是基于win32 waitable timer(queued timer),每个timer都会对应win32 handle,消耗windows资源。
System.Threading.Timer是轻量级的,不占用win32资源。
参考对比资料:http://msdn.……


你的建议是用Threading.Timer,但是最好要优化一下监控程,这个要比单纯的多线程sleep要好,我理解的对不? 序 

#26


引用 24 楼  的回复:
要看你用的是哪个timer。
System.Windows.Forms.Timer和System.Timers.Timer都是基于win32 waitable timer(queued timer),每个timer都会对应win32 handle,消耗windows资源。
System.Threading.Timer是轻量级的,不占用win32资源。
参考对比资料:http://msdn.……


昨天和同事探讨的时候 还提供了一个方案
用ThreadingPool 
不知道这个和Threading.Timer比哪个更好一些?

#27


timer触发事件时,就是从thread pool里面抓线程来执行事件处理程序,.net帮你自动完成了这一过程。

#28


很神奇哦

#29


确实很神奇哦

#30


timer本来就是单线程~

#31


菜鸟的用法,必死无疑。

#32


引用 31 楼  的回复:
菜鸟的用法,必死无疑。


请大神赐教

#33


我一般是开个线程用while(1) 和sleep(10)

#34


用线程吧,timer容易死

#35


很有借鉴意义

#36


不用Timer,Timer多了的确不准确,改用“事件触发”机制吧,在事件发生的时候计数器加一即可,然后看看此时距离上一次触发事件的时间。

#37


一般来说都是需要准确计时才用timer,如果是事件触发肯定是用线程比较好。

#38


只用1个小timer多好啊

#39


http://hi.baidu.com/liuzumou/item/4571f5ca098bec1250505855
找到篇文章
是介绍System.Threading.Timer的 
这个Timer和另外两个的区别是 由线程池线程服务

原本打算直接用线程 看到这个 是不是也可以用Threading.Timer了?

#40


引用 36 楼  的回复:
不用Timer,Timer多了的确不准确,改用“事件触发”机制吧,在事件发生的时候计数器加一即可,然后看看此时距离上一次触发事件的时间。


事件触发机制不行,数据监控的意义要在于及时,如果用事件触发机制的话,如果本次数据不过来,就不会触发验证机制,达不到及时报警的效果

#41


引用 38 楼  的回复:
只用1个小timer多好啊


呃 没看懂回复。。。
 以我的需求 1个timer肯定不够用啊

#42


引用 6 楼  的回复:
补充一下 
这是个监控的系统 
要求要一直运行着 不是只跑一次

做监控系统都用timer控件吗???这样也行?  
我前几天还在改彩票出票监控系统  我是用线程实现的  每一台出票机对应一个线程 一个系统监控五十台体彩打票机 监控这五十台打票机器为兑奖票数变化和 各种彩种已下单未出票的单子数量变化

#43


引用 42 楼  的回复:
引用 6 楼  的回复:

补充一下
这是个监控的系统
要求要一直运行着 不是只跑一次

做监控系统都用timer控件吗???这样也行?  
我前几天还在改彩票出票监控系统  我是用线程实现的  每一台出票机对应一个线程 一个系统监控五十台体彩打票机 监控这五十台打票机器为兑奖票数变化和 各种彩种已下单未出票的单子数量变化



没说非要用timer,只是在讨论,你的监控频率是多少?逻辑复杂吗?机器的压力大吗?

#44


5秒刷新一次 逻辑能有多复杂啊  50个线程异步调用接口 拿数据绑定 就OK了 主要看你要做是调用接口还是查数据库了  我是用接口的 对机器没什么压力 CPU都没咋变化

#45


引用 44 楼  的回复:
5秒刷新一次 逻辑能有多复杂啊  50个线程异步调用接口 拿数据绑定 就OK了 主要看你要做是调用接口还是查数据库了  我是用接口的 对机器没什么压力 CPU都没咋变化

上图
[img=http://my.csdn.net/my/album/detail/1349362][/img]

#46


#47


用多了timer不好,多了之后程序会变得很卡,建议使用多线程。

#48


有个简单的解决方法,仅供参考,谨慎使用:
用一个定时器,定时很短的时间,假设500毫秒
每个逻辑部分定一个时钟,从0开始计,假设A需要5秒定时,B 6秒,C7秒。
定时器每次ABC轮询一次,ABC的时钟各自累加,哪一个到达了就加到处理队列,由处理线程去做,定时器不阻塞。
典型的IM Server, Web Server等长连接轮询一般都用这种方法。

#49


这个方法的前提很明确:定时器里绝对不能阻塞,只进行时钟累加和触发事件,其他线程接到事件再做处理。

#50


引用 47 楼  的回复:
用多了timer不好,多了之后程序会变得很卡,建议使用多线程。



timer 本事就是 线程了,