是用Timer好还是线程好?

时间:2022-02-04 14:35:28
针对
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


是用Timer好还是线程好?
是用Timer好还是线程好?
自己看吧

#3


从CPU使用记录上来看很明显,Thread能用我CPU的4个核心分担工作量
而Timer...

#4


懂了 内存上 可能差不太多
但是cpu上 应该是线程要好得多 

我看用Timer的时候 用的是Form.Timer
能用System.Threading.Timer再帮我试试吗?
多谢

#5


多核的机器用线程效率高

#6


说一下 Timer 与 Thread 的本质区别

Timer  是在 主线程里执行的
Thread 是在自己的线程中执行的


所以在多核心多线程的 CPU 中当然线程的效率高了

#7


引用 6 楼  的回复:
说一下 Timer 与 Thread 的本质区别

Timer  是在 主线程里执行的
Thread 是在自己的线程中执行的


所以在多核心多线程的 CPU 中当然线程的效率高了


受教了 多谢

#8


引用 6 楼  的回复:
说一下 Timer 与 Thread 的本质区别

Timer  是在 主线程里执行的
Thread 是在自己的线程中执行的


所以在多核心多线程的 CPU 中当然线程的效率高了


+++1

#9


大家好才是真的好~

#10


System.Windows.Timer?这是运行在主线程的。2楼,你试过System.Timers.Timer吗?
还有很疑惑的地方,跨线程调用窗体控件的时候,你的咋不抛异常呢?Control.CheckForIllegalCrossThreadCalls = false;?

#11


而且楼主需求也不明确,为什么要开1000个线程?你是要做什么东西?如果你是要定时执行一个方法的话,果断用System.Timers.Timer类,System.Timers.Timer也是一个单独的线程,所以访问窗体控件的时候,也必须使用委托!

#12


肯定单独的线程的更好啊~

#13


我看了你的原帖,你的数据是谁给你的,是不是自己的程序?数据是存放在数据库还是在别的地方?用的什么数据库,有很多数据库有触发器这种东西的。这种事情不用你轮询去读数据,效率低下,耗费大量系统资源!~

#14


引用 13 楼  的回复:
我看了你的原帖,你的数据是谁给你的,是不是自己的程序?数据是存放在数据库还是在别的地方?用的什么数据库,有很多数据库有触发器这种东西的。这种事情不用你轮询去读数据,效率低下,耗费大量系统资源!~

何必这么较真呢.思路有没有问题不是你要关心的,LZ贴什么问题 能回答 就回答下,如果像你这样,LZ问个问题岂不是要把整个系统全发上来?...呵呵

#15


Timer 本身 就是线程好不。  

#16


你真 牛逼创建 1000个 Timer, 


#17


引用 1 楼  的回复:
自己看吧


你这代码写的 问题非常严重,什么机器 隔着你这么搞啊 

#18


引用 11 楼  的回复:
而且楼主需求也不明确,为什么要开1000个线程?你是要做什么东西?如果你是要定时执行一个方法的话,果断用System.Timers.Timer类,System.Timers.Timer也是一个单独的线程,所以访问窗体控件的时候,也必须使用委托!


是做监控系统,1000个是我的假设量,初期可能没这么多,后期可能不止这些

#19


引用 13 楼  的回复:
我看了你的原帖,你的数据是谁给你的,是不是自己的程序?数据是存放在数据库还是在别的地方?用的什么数据库,有很多数据库有触发器这种东西的。这种事情不用你轮询去读数据,效率低下,耗费大量系统资源!~


用触发器是不可能的,首先触发器是带事物的,如果触发器失败的话,插入的数据也失败了
这个需求只是一个监控需求,不应该影响原业务的数据

数据是存放到数据库里的

#20


引用 17 楼  的回复:
引用 1 楼  的回复:
自己看吧


你这代码写的 问题非常严重,什么机器 隔着你这么搞啊


这应该只是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;//在数据库插入的地方声明改事件,在需要报警的地方订阅该事件

能熟练使用委托和事件的,应该一看就明白了!~

#25


引用 23 楼  的回复:
不管是1000个线程也好,timer也好。这种解决方案就是效率低下,C#中的委托和事件,这么强大的东西,效率比你1000个线程轮询高太多太多了。解决方案:将表A的数据写入数据之后,触发一个委托事件。


这方法不行,我说了 要数据插入操作和监控操作要完全分离,不可能放到一起
首先,因为业务不同,可能插入的地方,有的是bs的有的是cs的,有的是服务,有的是应用程序,
你这样做的要求就是要每个插入的地方都做修改,且不考虑以前的系统,即使是新开发的系统,也是一个开销

我要实现的是一个监控系统,不是一个监控的思路,所以一定要分离,要做成应用的形式

#26


引用 24 楼  的回复:
public delegate void EventTableChanged(int Table, int value);
public event EventTableChanged;//在数据库插入的地方声明改事件,在需要报警的地方订阅该事件

能熟练使用委托和事件的,应该一看就明白了!~


这方法如果是在同一个系统中的确可行,可惜了不是。。。

#27


看了那兄弟的帖子
为什么不用事件呢。。。

#28


引用 27 楼  的回复:
看了那兄弟的帖子
为什么不用事件呢。。。


我是要用这个思路做一个监控系统,是监控不同库不同表不同的业务,所以不可能让所有的系统都做修改
要兼顾已经上线的系统和还没上线的系统,已经上线的系统不可能让所有的系统都为了监控修改

#29


那还用问什么了,原系统不给该。只能用线程轮询咯!结贴吧

#30


引用 29 楼  的回复:
那还用问什么了,原系统不给该。只能用线程轮询咯!结贴吧


。。。。。。
只是想讨论一下嘛 看有没有好方法
目前比较倾向于用Threading.Timer
这个是基于线程的计时器,且内部是用ThreadingPool的

#31


引用 30 楼  的回复:
引用 29 楼  的回复:

那还用问什么了,原系统不给该。只能用线程轮询咯!结贴吧


。。。。。。
只是想讨论一下嘛 看有没有好方法
目前比较倾向于用Threading.Timer
这个是基于线程的计时器,且内部是用ThreadingPool的


其实还有一个问题 用线程的话 sleep的时候是不占cpu资源的
我不知道timer在计时的时候是否占用
之前一个哥们测试了夏
用普通的timer的话 cpu利用率很低
一会我再试试用Threading.Timer看看他的cpu利用率怎么样

如果和用单纯的线程一样好的话 就用Threading.Timer
否则的话 就老老实实用线程吧。。。

#1


是用Timer好还是线程好?
是用Timer好还是线程好?
自己看吧

#2


#3


从CPU使用记录上来看很明显,Thread能用我CPU的4个核心分担工作量
而Timer...

#4


懂了 内存上 可能差不太多
但是cpu上 应该是线程要好得多 

我看用Timer的时候 用的是Form.Timer
能用System.Threading.Timer再帮我试试吗?
多谢

#5


多核的机器用线程效率高

#6


说一下 Timer 与 Thread 的本质区别

Timer  是在 主线程里执行的
Thread 是在自己的线程中执行的


所以在多核心多线程的 CPU 中当然线程的效率高了

#7


引用 6 楼  的回复:
说一下 Timer 与 Thread 的本质区别

Timer  是在 主线程里执行的
Thread 是在自己的线程中执行的


所以在多核心多线程的 CPU 中当然线程的效率高了


受教了 多谢

#8


引用 6 楼  的回复:
说一下 Timer 与 Thread 的本质区别

Timer  是在 主线程里执行的
Thread 是在自己的线程中执行的


所以在多核心多线程的 CPU 中当然线程的效率高了


+++1

#9


大家好才是真的好~

#10


System.Windows.Timer?这是运行在主线程的。2楼,你试过System.Timers.Timer吗?
还有很疑惑的地方,跨线程调用窗体控件的时候,你的咋不抛异常呢?Control.CheckForIllegalCrossThreadCalls = false;?

#11


而且楼主需求也不明确,为什么要开1000个线程?你是要做什么东西?如果你是要定时执行一个方法的话,果断用System.Timers.Timer类,System.Timers.Timer也是一个单独的线程,所以访问窗体控件的时候,也必须使用委托!

#12


肯定单独的线程的更好啊~

#13


我看了你的原帖,你的数据是谁给你的,是不是自己的程序?数据是存放在数据库还是在别的地方?用的什么数据库,有很多数据库有触发器这种东西的。这种事情不用你轮询去读数据,效率低下,耗费大量系统资源!~

#14


引用 13 楼  的回复:
我看了你的原帖,你的数据是谁给你的,是不是自己的程序?数据是存放在数据库还是在别的地方?用的什么数据库,有很多数据库有触发器这种东西的。这种事情不用你轮询去读数据,效率低下,耗费大量系统资源!~

何必这么较真呢.思路有没有问题不是你要关心的,LZ贴什么问题 能回答 就回答下,如果像你这样,LZ问个问题岂不是要把整个系统全发上来?...呵呵

#15


Timer 本身 就是线程好不。  

#16


你真 牛逼创建 1000个 Timer, 


#17


引用 1 楼  的回复:
自己看吧


你这代码写的 问题非常严重,什么机器 隔着你这么搞啊 

#18


引用 11 楼  的回复:
而且楼主需求也不明确,为什么要开1000个线程?你是要做什么东西?如果你是要定时执行一个方法的话,果断用System.Timers.Timer类,System.Timers.Timer也是一个单独的线程,所以访问窗体控件的时候,也必须使用委托!


是做监控系统,1000个是我的假设量,初期可能没这么多,后期可能不止这些

#19


引用 13 楼  的回复:
我看了你的原帖,你的数据是谁给你的,是不是自己的程序?数据是存放在数据库还是在别的地方?用的什么数据库,有很多数据库有触发器这种东西的。这种事情不用你轮询去读数据,效率低下,耗费大量系统资源!~


用触发器是不可能的,首先触发器是带事物的,如果触发器失败的话,插入的数据也失败了
这个需求只是一个监控需求,不应该影响原业务的数据

数据是存放到数据库里的

#20


引用 17 楼  的回复:
引用 1 楼  的回复:
自己看吧


你这代码写的 问题非常严重,什么机器 隔着你这么搞啊


这应该只是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;//在数据库插入的地方声明改事件,在需要报警的地方订阅该事件

能熟练使用委托和事件的,应该一看就明白了!~

#25


引用 23 楼  的回复:
不管是1000个线程也好,timer也好。这种解决方案就是效率低下,C#中的委托和事件,这么强大的东西,效率比你1000个线程轮询高太多太多了。解决方案:将表A的数据写入数据之后,触发一个委托事件。


这方法不行,我说了 要数据插入操作和监控操作要完全分离,不可能放到一起
首先,因为业务不同,可能插入的地方,有的是bs的有的是cs的,有的是服务,有的是应用程序,
你这样做的要求就是要每个插入的地方都做修改,且不考虑以前的系统,即使是新开发的系统,也是一个开销

我要实现的是一个监控系统,不是一个监控的思路,所以一定要分离,要做成应用的形式

#26


引用 24 楼  的回复:
public delegate void EventTableChanged(int Table, int value);
public event EventTableChanged;//在数据库插入的地方声明改事件,在需要报警的地方订阅该事件

能熟练使用委托和事件的,应该一看就明白了!~


这方法如果是在同一个系统中的确可行,可惜了不是。。。

#27


看了那兄弟的帖子
为什么不用事件呢。。。

#28


引用 27 楼  的回复:
看了那兄弟的帖子
为什么不用事件呢。。。


我是要用这个思路做一个监控系统,是监控不同库不同表不同的业务,所以不可能让所有的系统都做修改
要兼顾已经上线的系统和还没上线的系统,已经上线的系统不可能让所有的系统都为了监控修改

#29


那还用问什么了,原系统不给该。只能用线程轮询咯!结贴吧

#30


引用 29 楼  的回复:
那还用问什么了,原系统不给该。只能用线程轮询咯!结贴吧


。。。。。。
只是想讨论一下嘛 看有没有好方法
目前比较倾向于用Threading.Timer
这个是基于线程的计时器,且内部是用ThreadingPool的

#31


引用 30 楼  的回复:
引用 29 楼  的回复:

那还用问什么了,原系统不给该。只能用线程轮询咯!结贴吧


。。。。。。
只是想讨论一下嘛 看有没有好方法
目前比较倾向于用Threading.Timer
这个是基于线程的计时器,且内部是用ThreadingPool的


其实还有一个问题 用线程的话 sleep的时候是不占cpu资源的
我不知道timer在计时的时候是否占用
之前一个哥们测试了夏
用普通的timer的话 cpu利用率很低
一会我再试试用Threading.Timer看看他的cpu利用率怎么样

如果和用单纯的线程一样好的话 就用Threading.Timer
否则的话 就老老实实用线程吧。。。