1:不确定Timer的效率问题?
针对上面的需求,其实我是想做一个监控数据的系统
比如表A大概每秒insert数据大概在100-10000之间
那我做一个监控,当这个表每秒进来的数据超过这个范围的时候,我就认为这个表对应的作业/任务有异常,就报警
因为不同的业务处理逻辑以及周期不一样,所以不能用统一的Timer,只能是每个逻辑(或者说每个监控)用一个自己的Timer
如果需要监控的逻辑有1000个,那就有1000个Timer
2:不知道这样做好不好?
3:如果不好,大家有什么好的建议?
多谢各位。。。
105 个解决方案
#1
自找麻烦,改用线程吧
#2
当然不好 个人觉得
#3
你想把程序搞死吧
#4
用线程的sleep和while true达到Timer的效果?
#5
实在不行就用一个超小的timer,然后每个逻辑对应一个counter。
#6
补充一下
这是个监控的系统
要求要一直运行着 不是只跑一次
这是个监控的系统
要求要一直运行着 不是只跑一次
#7
尽量使用少的timer做类似的工作,尽量合并现有timer,可以提高稳定性和性能
比如一个timer的tick是5秒,另一个timer的tick是10秒
可以只使用第一个timer,在count = 2的时候,触发第二个timer应该做的事情
比如一个timer的tick是5秒,另一个timer的tick是10秒
可以只使用第一个timer,在count = 2的时候,触发第二个timer应该做的事情
#8
感觉用线程比较好
#9
达不到Timer的什么效果?
#10
那是你自己 找无聊吧,
开多了 好资源的 CPU 。
开多了 好资源的 CPU 。
#11
这种问题还是用线程来解决吧。
#12
如果要监控仪器是否正常的话不建议用Timer
1.Timer本身就不准确,不是绝对的时间定义,至于Timer的误差,没有统计数据,Timer用的越多越不准确。
2.如果仪器有应答模式,发命令,收回复就可以了确定仪器的工作状态。
3.如果仪器只是单纯上传数据,比较数据内容比用Timer更准确,也更敏感。
1.Timer本身就不准确,不是绝对的时间定义,至于Timer的误差,没有统计数据,Timer用的越多越不准确。
2.如果仪器有应答模式,发命令,收回复就可以了确定仪器的工作状态。
3.如果仪器只是单纯上传数据,比较数据内容比用Timer更准确,也更敏感。
#13
呃 我不是在质疑达不到 我是确认一下1L建议用线程是不是要和Timer的效果一样
但是要比Timer要好
#14
其实很神奇的是,既然是往数据表里插入数据,记录竟然没有保存创建时间?哪需要监视呢?
#15
或者比如通过事件的方式,插入数据触发一个事件,判断两次或多次触发的间隔,就能知道频率了,哪需要定时器呢
#16
把几个不同的周期合并在一直,减少Timer数量
#17
这个可以考虑
#18
是要做数据级监控 满足一定筏值条件报警 创建时间当然要有了 不然没法做监控的
处理大数据量的时候 或者是处理敏感数据的时候 肯定要有监控啊
没有监控的项目。。。
#19
呃 是不是你理解错了。。。。
我要的不是知道频率 是要知道频率内的数据量是否符合要求 不符合要求要报警
插入数据触发事件 说的是触发器吗?
这个也不行 因为触发器是带事物的 如果在触发事件的时候出错的话 那插入的数据就有问题了
如果不是触发器的话,你说的应该是记录日志之类的操作,然后分析日志吧?这样也不行的,这样的实现方式适合类似数据分析的需求,而我说的监控肯定是实时的
#20
Timer 是在主线程中执行的,如果在Timer中执行耗时的操作,会造成界面卡死
#21
#22
Timer本来就是基于优先队列的,用单线程sleep要么更差(忙得来的时候),要么根本就是错误的(忙不来的时候)。
事件模式才是解决方案。
事件模式才是解决方案。
#23
1、timer只是间隔触发
2、timer的间隔不精确
3、timer的间隔跟自然时间没啥关系,比如间隔1分钟的timer,并不是在每个分钟的0秒时发生
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事件处理程序(就是你的监控程序),让它们执行的时间更短。
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
你的建议是用Threading.Timer,但是最好要优化一下监控程,这个要比单纯的多线程sleep要好,我理解的对不? 序
#26
昨天和同事探讨的时候 还提供了一个方案
用ThreadingPool
不知道这个和Threading.Timer比哪个更好一些?
#27
timer触发事件时,就是从thread pool里面抓线程来执行事件处理程序,.net帮你自动完成了这一过程。
#28
很神奇哦
#29
确实很神奇哦
#30
timer本来就是单线程~
#31
菜鸟的用法,必死无疑。
#32
请大神赐教
#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了?
找到篇文章
是介绍System.Threading.Timer的
这个Timer和另外两个的区别是 由线程池线程服务
原本打算直接用线程 看到这个 是不是也可以用Threading.Timer了?
#40
事件触发机制不行,数据监控的意义要在于及时,如果用事件触发机制的话,如果本次数据不过来,就不会触发验证机制,达不到及时报警的效果
#41
呃 没看懂回复。。。
以我的需求 1个timer肯定不够用啊
#42
做监控系统都用timer控件吗???这样也行?
我前几天还在改彩票出票监控系统 我是用线程实现的 每一台出票机对应一个线程 一个系统监控五十台体彩打票机 监控这五十台打票机器为兑奖票数变化和 各种彩种已下单未出票的单子数量变化
#43
没说非要用timer,只是在讨论,你的监控频率是多少?逻辑复杂吗?机器的压力大吗?
#44
5秒刷新一次 逻辑能有多复杂啊 50个线程异步调用接口 拿数据绑定 就OK了 主要看你要做是调用接口还是查数据库了 我是用接口的 对机器没什么压力 CPU都没咋变化
#45
上图
[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等长连接轮询一般都用这种方法。
用一个定时器,定时很短的时间,假设500毫秒
每个逻辑部分定一个时钟,从0开始计,假设A需要5秒定时,B 6秒,C7秒。
定时器每次ABC轮询一次,ABC的时钟各自累加,哪一个到达了就加到处理队列,由处理线程去做,定时器不阻塞。
典型的IM Server, Web Server等长连接轮询一般都用这种方法。
#49
这个方法的前提很明确:定时器里绝对不能阻塞,只进行时钟累加和触发事件,其他线程接到事件再做处理。
#50
timer 本事就是 线程了,
#1
自找麻烦,改用线程吧
#2
当然不好 个人觉得
#3
你想把程序搞死吧
#4
用线程的sleep和while true达到Timer的效果?
#5
实在不行就用一个超小的timer,然后每个逻辑对应一个counter。
#6
补充一下
这是个监控的系统
要求要一直运行着 不是只跑一次
这是个监控的系统
要求要一直运行着 不是只跑一次
#7
尽量使用少的timer做类似的工作,尽量合并现有timer,可以提高稳定性和性能
比如一个timer的tick是5秒,另一个timer的tick是10秒
可以只使用第一个timer,在count = 2的时候,触发第二个timer应该做的事情
比如一个timer的tick是5秒,另一个timer的tick是10秒
可以只使用第一个timer,在count = 2的时候,触发第二个timer应该做的事情
#8
感觉用线程比较好
#9
达不到Timer的什么效果?
#10
那是你自己 找无聊吧,
开多了 好资源的 CPU 。
开多了 好资源的 CPU 。
#11
这种问题还是用线程来解决吧。
#12
如果要监控仪器是否正常的话不建议用Timer
1.Timer本身就不准确,不是绝对的时间定义,至于Timer的误差,没有统计数据,Timer用的越多越不准确。
2.如果仪器有应答模式,发命令,收回复就可以了确定仪器的工作状态。
3.如果仪器只是单纯上传数据,比较数据内容比用Timer更准确,也更敏感。
1.Timer本身就不准确,不是绝对的时间定义,至于Timer的误差,没有统计数据,Timer用的越多越不准确。
2.如果仪器有应答模式,发命令,收回复就可以了确定仪器的工作状态。
3.如果仪器只是单纯上传数据,比较数据内容比用Timer更准确,也更敏感。
#13
呃 我不是在质疑达不到 我是确认一下1L建议用线程是不是要和Timer的效果一样
但是要比Timer要好
#14
其实很神奇的是,既然是往数据表里插入数据,记录竟然没有保存创建时间?哪需要监视呢?
#15
或者比如通过事件的方式,插入数据触发一个事件,判断两次或多次触发的间隔,就能知道频率了,哪需要定时器呢
#16
把几个不同的周期合并在一直,减少Timer数量
#17
这个可以考虑
#18
是要做数据级监控 满足一定筏值条件报警 创建时间当然要有了 不然没法做监控的
处理大数据量的时候 或者是处理敏感数据的时候 肯定要有监控啊
没有监控的项目。。。
#19
呃 是不是你理解错了。。。。
我要的不是知道频率 是要知道频率内的数据量是否符合要求 不符合要求要报警
插入数据触发事件 说的是触发器吗?
这个也不行 因为触发器是带事物的 如果在触发事件的时候出错的话 那插入的数据就有问题了
如果不是触发器的话,你说的应该是记录日志之类的操作,然后分析日志吧?这样也不行的,这样的实现方式适合类似数据分析的需求,而我说的监控肯定是实时的
#20
Timer 是在主线程中执行的,如果在Timer中执行耗时的操作,会造成界面卡死
#21
#22
Timer本来就是基于优先队列的,用单线程sleep要么更差(忙得来的时候),要么根本就是错误的(忙不来的时候)。
事件模式才是解决方案。
事件模式才是解决方案。
#23
1、timer只是间隔触发
2、timer的间隔不精确
3、timer的间隔跟自然时间没啥关系,比如间隔1分钟的timer,并不是在每个分钟的0秒时发生
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事件处理程序(就是你的监控程序),让它们执行的时间更短。
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
你的建议是用Threading.Timer,但是最好要优化一下监控程,这个要比单纯的多线程sleep要好,我理解的对不? 序
#26
昨天和同事探讨的时候 还提供了一个方案
用ThreadingPool
不知道这个和Threading.Timer比哪个更好一些?
#27
timer触发事件时,就是从thread pool里面抓线程来执行事件处理程序,.net帮你自动完成了这一过程。
#28
很神奇哦
#29
确实很神奇哦
#30
timer本来就是单线程~
#31
菜鸟的用法,必死无疑。
#32
请大神赐教
#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了?
找到篇文章
是介绍System.Threading.Timer的
这个Timer和另外两个的区别是 由线程池线程服务
原本打算直接用线程 看到这个 是不是也可以用Threading.Timer了?
#40
事件触发机制不行,数据监控的意义要在于及时,如果用事件触发机制的话,如果本次数据不过来,就不会触发验证机制,达不到及时报警的效果
#41
呃 没看懂回复。。。
以我的需求 1个timer肯定不够用啊
#42
做监控系统都用timer控件吗???这样也行?
我前几天还在改彩票出票监控系统 我是用线程实现的 每一台出票机对应一个线程 一个系统监控五十台体彩打票机 监控这五十台打票机器为兑奖票数变化和 各种彩种已下单未出票的单子数量变化
#43
没说非要用timer,只是在讨论,你的监控频率是多少?逻辑复杂吗?机器的压力大吗?
#44
5秒刷新一次 逻辑能有多复杂啊 50个线程异步调用接口 拿数据绑定 就OK了 主要看你要做是调用接口还是查数据库了 我是用接口的 对机器没什么压力 CPU都没咋变化
#45
上图
[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等长连接轮询一般都用这种方法。
用一个定时器,定时很短的时间,假设500毫秒
每个逻辑部分定一个时钟,从0开始计,假设A需要5秒定时,B 6秒,C7秒。
定时器每次ABC轮询一次,ABC的时钟各自累加,哪一个到达了就加到处理队列,由处理线程去做,定时器不阻塞。
典型的IM Server, Web Server等长连接轮询一般都用这种方法。
#49
这个方法的前提很明确:定时器里绝对不能阻塞,只进行时钟累加和触发事件,其他线程接到事件再做处理。
#50
timer 本事就是 线程了,