http://topic.csdn.net/u/20121029/16/4ff55293-13a7-4792-b650-91b5e1c42af0.html?seed=1223022908&r=80024247#r_80024247
这个的问题
如果需要开1000个的话
是开1000个Timer好
还是1000个线程好?
Timer/线程如果开1000个 能把cpu或者内存拖死不?
31 个解决方案
#1
自己看吧
#2
#3
从CPU使用记录上来看很明显,Thread能用我CPU的4个核心分担工作量
而Timer...
而Timer...
#4
懂了 内存上 可能差不太多
但是cpu上 应该是线程要好得多
我看用Timer的时候 用的是Form.Timer
能用System.Threading.Timer再帮我试试吗?
多谢
但是cpu上 应该是线程要好得多
我看用Timer的时候 用的是Form.Timer
能用System.Threading.Timer再帮我试试吗?
多谢
#5
多核的机器用线程效率高
#6
说一下 Timer 与 Thread 的本质区别
Timer 是在 主线程里执行的
Thread 是在自己的线程中执行的
所以在多核心多线程的 CPU 中当然线程的效率高了
Timer 是在 主线程里执行的
Thread 是在自己的线程中执行的
所以在多核心多线程的 CPU 中当然线程的效率高了
#7
受教了 多谢
#8
+++1
#9
大家好才是真的好~
#10
System.Windows.Timer?这是运行在主线程的。2楼,你试过System.Timers.Timer吗?
还有很疑惑的地方,跨线程调用窗体控件的时候,你的咋不抛异常呢?Control.CheckForIllegalCrossThreadCalls = false;?
还有很疑惑的地方,跨线程调用窗体控件的时候,你的咋不抛异常呢?Control.CheckForIllegalCrossThreadCalls = false;?
#11
而且楼主需求也不明确,为什么要开1000个线程?你是要做什么东西?如果你是要定时执行一个方法的话,果断用System.Timers.Timer类,System.Timers.Timer也是一个单独的线程,所以访问窗体控件的时候,也必须使用委托!
#12
肯定单独的线程的更好啊~
#13
我看了你的原帖,你的数据是谁给你的,是不是自己的程序?数据是存放在数据库还是在别的地方?用的什么数据库,有很多数据库有触发器这种东西的。这种事情不用你轮询去读数据,效率低下,耗费大量系统资源!~
#14
何必这么较真呢.思路有没有问题不是你要关心的,LZ贴什么问题 能回答 就回答下,如果像你这样,LZ问个问题岂不是要把整个系统全发上来?...呵呵
#15
Timer 本身 就是线程好不。
#16
你真 牛逼创建 1000个 Timer,
#17
你这代码写的 问题非常严重,什么机器 隔着你这么搞啊
#18
是做监控系统,1000个是我的假设量,初期可能没这么多,后期可能不止这些
#19
用触发器是不可能的,首先触发器是带事物的,如果触发器失败的话,插入的数据也失败了
这个需求只是一个监控需求,不应该影响原业务的数据
数据是存放到数据库里的
#20
这应该只是1L想帮LZ验证一下问题 写的测试代码吧。。。
#21
Forms命名空间下的Timer不是真正的Timer,是通过在消息队列里插入消息来模拟的,就你的情况而言,这个Timer压根不用考虑。Threading下的Timer启动的任务就是在新线程里执行的,使用这个Timer和使用新线程其实是一码事。所以,你还是想办法把线程数量降下来才是正道
#22
来学习一下,呵呵
#23
不管是1000个线程也好,timer也好。这种解决方案就是效率低下,C#中的委托和事件,这么强大的东西,效率比你1000个线程轮询高太多太多了。解决方案:将表A的数据写入数据之后,触发一个委托事件。
#24
public delegate void EventTableChanged(int Table, int value);
public event EventTableChanged;//在数据库插入的地方声明改事件,在需要报警的地方订阅该事件
能熟练使用委托和事件的,应该一看就明白了!~
public event EventTableChanged;//在数据库插入的地方声明改事件,在需要报警的地方订阅该事件
能熟练使用委托和事件的,应该一看就明白了!~
#25
这方法不行,我说了 要数据插入操作和监控操作要完全分离,不可能放到一起
首先,因为业务不同,可能插入的地方,有的是bs的有的是cs的,有的是服务,有的是应用程序,
你这样做的要求就是要每个插入的地方都做修改,且不考虑以前的系统,即使是新开发的系统,也是一个开销
我要实现的是一个监控系统,不是一个监控的思路,所以一定要分离,要做成应用的形式
#26
这方法如果是在同一个系统中的确可行,可惜了不是。。。
#27
看了那兄弟的帖子
为什么不用事件呢。。。
为什么不用事件呢。。。
#28
我是要用这个思路做一个监控系统,是监控不同库不同表不同的业务,所以不可能让所有的系统都做修改
要兼顾已经上线的系统和还没上线的系统,已经上线的系统不可能让所有的系统都为了监控修改
#29
那还用问什么了,原系统不给该。只能用线程轮询咯!结贴吧
#30
。。。。。。
只是想讨论一下嘛 看有没有好方法
目前比较倾向于用Threading.Timer
这个是基于线程的计时器,且内部是用ThreadingPool的
#31
其实还有一个问题 用线程的话 sleep的时候是不占cpu资源的
我不知道timer在计时的时候是否占用
之前一个哥们测试了夏
用普通的timer的话 cpu利用率很低
一会我再试试用Threading.Timer看看他的cpu利用率怎么样
如果和用单纯的线程一样好的话 就用Threading.Timer
否则的话 就老老实实用线程吧。。。
#1
自己看吧
#2
戳了 图片就一半了..
Timer: http://img.my.csdn.net/uploads/201210/29/1351502470_6468.png
Thread: http://img.my.csdn.net/uploads/201210/29/1351502469_9859.png
Timer: http://img.my.csdn.net/uploads/201210/29/1351502470_6468.png
Thread: http://img.my.csdn.net/uploads/201210/29/1351502469_9859.png
#3
从CPU使用记录上来看很明显,Thread能用我CPU的4个核心分担工作量
而Timer...
而Timer...
#4
懂了 内存上 可能差不太多
但是cpu上 应该是线程要好得多
我看用Timer的时候 用的是Form.Timer
能用System.Threading.Timer再帮我试试吗?
多谢
但是cpu上 应该是线程要好得多
我看用Timer的时候 用的是Form.Timer
能用System.Threading.Timer再帮我试试吗?
多谢
#5
多核的机器用线程效率高
#6
说一下 Timer 与 Thread 的本质区别
Timer 是在 主线程里执行的
Thread 是在自己的线程中执行的
所以在多核心多线程的 CPU 中当然线程的效率高了
Timer 是在 主线程里执行的
Thread 是在自己的线程中执行的
所以在多核心多线程的 CPU 中当然线程的效率高了
#7
受教了 多谢
#8
+++1
#9
大家好才是真的好~
#10
System.Windows.Timer?这是运行在主线程的。2楼,你试过System.Timers.Timer吗?
还有很疑惑的地方,跨线程调用窗体控件的时候,你的咋不抛异常呢?Control.CheckForIllegalCrossThreadCalls = false;?
还有很疑惑的地方,跨线程调用窗体控件的时候,你的咋不抛异常呢?Control.CheckForIllegalCrossThreadCalls = false;?
#11
而且楼主需求也不明确,为什么要开1000个线程?你是要做什么东西?如果你是要定时执行一个方法的话,果断用System.Timers.Timer类,System.Timers.Timer也是一个单独的线程,所以访问窗体控件的时候,也必须使用委托!
#12
肯定单独的线程的更好啊~
#13
我看了你的原帖,你的数据是谁给你的,是不是自己的程序?数据是存放在数据库还是在别的地方?用的什么数据库,有很多数据库有触发器这种东西的。这种事情不用你轮询去读数据,效率低下,耗费大量系统资源!~
#14
何必这么较真呢.思路有没有问题不是你要关心的,LZ贴什么问题 能回答 就回答下,如果像你这样,LZ问个问题岂不是要把整个系统全发上来?...呵呵
#15
Timer 本身 就是线程好不。
#16
你真 牛逼创建 1000个 Timer,
#17
你这代码写的 问题非常严重,什么机器 隔着你这么搞啊
#18
是做监控系统,1000个是我的假设量,初期可能没这么多,后期可能不止这些
#19
用触发器是不可能的,首先触发器是带事物的,如果触发器失败的话,插入的数据也失败了
这个需求只是一个监控需求,不应该影响原业务的数据
数据是存放到数据库里的
#20
这应该只是1L想帮LZ验证一下问题 写的测试代码吧。。。
#21
Forms命名空间下的Timer不是真正的Timer,是通过在消息队列里插入消息来模拟的,就你的情况而言,这个Timer压根不用考虑。Threading下的Timer启动的任务就是在新线程里执行的,使用这个Timer和使用新线程其实是一码事。所以,你还是想办法把线程数量降下来才是正道
#22
来学习一下,呵呵
#23
不管是1000个线程也好,timer也好。这种解决方案就是效率低下,C#中的委托和事件,这么强大的东西,效率比你1000个线程轮询高太多太多了。解决方案:将表A的数据写入数据之后,触发一个委托事件。
#24
public delegate void EventTableChanged(int Table, int value);
public event EventTableChanged;//在数据库插入的地方声明改事件,在需要报警的地方订阅该事件
能熟练使用委托和事件的,应该一看就明白了!~
public event EventTableChanged;//在数据库插入的地方声明改事件,在需要报警的地方订阅该事件
能熟练使用委托和事件的,应该一看就明白了!~
#25
这方法不行,我说了 要数据插入操作和监控操作要完全分离,不可能放到一起
首先,因为业务不同,可能插入的地方,有的是bs的有的是cs的,有的是服务,有的是应用程序,
你这样做的要求就是要每个插入的地方都做修改,且不考虑以前的系统,即使是新开发的系统,也是一个开销
我要实现的是一个监控系统,不是一个监控的思路,所以一定要分离,要做成应用的形式
#26
这方法如果是在同一个系统中的确可行,可惜了不是。。。
#27
看了那兄弟的帖子
为什么不用事件呢。。。
为什么不用事件呢。。。
#28
我是要用这个思路做一个监控系统,是监控不同库不同表不同的业务,所以不可能让所有的系统都做修改
要兼顾已经上线的系统和还没上线的系统,已经上线的系统不可能让所有的系统都为了监控修改
#29
那还用问什么了,原系统不给该。只能用线程轮询咯!结贴吧
#30
。。。。。。
只是想讨论一下嘛 看有没有好方法
目前比较倾向于用Threading.Timer
这个是基于线程的计时器,且内部是用ThreadingPool的
#31
其实还有一个问题 用线程的话 sleep的时候是不占cpu资源的
我不知道timer在计时的时候是否占用
之前一个哥们测试了夏
用普通的timer的话 cpu利用率很低
一会我再试试用Threading.Timer看看他的cpu利用率怎么样
如果和用单纯的线程一样好的话 就用Threading.Timer
否则的话 就老老实实用线程吧。。。