3个Timer的区别(System.Threading.Timer,System.Windows.Forms.Timer,System.Timers.Timer)

hainang1234 2006-01-20 03:48:32
最近要做一计费系统,将会开多个线程并启动多个Timer进行并发计费。
所以想搞清楚一下三个Timer的区别,选一个耗资源比较少又较精确的Timer.[考虑的峰值为1000个Timer]
大家可以一起学习一下。

我所了解的(不对的地方麻烦指出来):
Windows.Forms.Timer是通过windows的消息机制发送Timer事件。它仅可在能处理windows消息循环的线程使用。
Threading.Timer是最轻量级的,它将在系统线程池分配的线程中定时运行,所以每次运行的线程不一定相同。
Timers.Timer在MSDN上说是为服务器设计的,但没明白它的优势是什么,是否是最精确的?耗资源呢?
...全文
2830 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2010-05-28
  • 打赏
  • 举报
回复
如果想要达到实时的效果,应该是用事件的机制,也就是说在进行和费用相关的操作的时候,应该触发进行如充值日志记录、帐户余额计算等事件,这样才能得到实时的计费信息。靠定时器来扫描肯定不是一个好的方案。定时器一般是用来做例如客户端里验证远程服务器是否可用这种类型的事情的。
aafly 2006-03-15
  • 打赏
  • 举报
回复
关注!
cooljw 2006-02-07
  • 打赏
  • 举报
回复
楼主很细心,没仔细想过这么多,帮顶一下
e_lyf 2006-02-07
  • 打赏
  • 举报
回复
关注
Ivony 2006-02-07
  • 打赏
  • 举报
回复
感觉上,Windows计时器就是命令Windows在多久之后为自己发一条消息,然后再被自己的消息循环捕获。
那么缺点是很显而易见的,就是如果消息队列中的消息太多,或者当前主线程被阻塞的时候,这条计时消息就可能在很晚的时候才被处理。

而服务器Timer很明显是另开一个线程计时,每一个Timer是一个独立的线程,独立的计时,所以精度非常高,并且Elapsed事件是在独立的线程上触发的。

hainang1234 2006-02-07
  • 打赏
  • 举报
回复
不会吧!过年了都没人帮忙呀!

----楼主
hainang1234 2006-02-07
  • 打赏
  • 举报
回复
也就是说System.Threading.Timers不管new多少个,实际上都只会有一个线程是吗?
Waitable Timer是什么实现我不懂,那么能不能直接的说一下,两个Timer的性能,精确度呢?
我可能得用几百个Timer,是该用Threading.Timer还是Timers.Timer?
----楼主
孟子E章 2006-02-07
  • 打赏
  • 举报
回复
Comparing the Timer Classes in the .NET Framework Class Library

http://msdn.microsoft.com/msdnmag/issues/04/02/TimersinNET/

System.Windows.Forms.Timer
System.Timers.Timer
System.Threading.Timer
Thread-safe Programming with Timers
Dealing with Timer Event Reentrance
Conclusion
孟子E章 2006-02-07
  • 打赏
  • 举报
回复
System.Threading.Timer与System.Timers.Timer的区别

http://blog.joycode.com/gangp/archive/2004/07/18/27745.aspx
hainang1234 2006-02-07
  • 打赏
  • 举报
回复
首先谢谢Ivony() 的关注,不过,你说的我都知道,我是想弄清楚Threading.Timer和Times.Timer的区别。
----楼主
hainang1234 2006-01-23
  • 打赏
  • 举报
回复
to hatita(悠远的风景):
这些Timer的分配本身都是不在一个线程中的,但其实这不重要,因为System.Threading.Timer本身就是在系统线程池中分配的线程执行的。System.Timers.Timer应该也是。

to zhy0101(香蕉):
要进行实时计费,只有开一个Timer每分钟检查一次。还有个方法是不停的遍历链表(计费信息放在链表中),我担心不停的遍历会对系统开销太大,对Socket连接产生影响。如果隔一段时间遍历一次又达不到实时效果。

谢谢大家。望大侠继续赐教。目前我是使用的System.Threading.Timer,感觉不是很精确。
----楼主
adandelion 2006-01-21
  • 打赏
  • 举报
回复
GZ
zhy0101 2006-01-21
  • 打赏
  • 举报
回复
干吗要这么多计时器
hatita 2006-01-20
  • 打赏
  • 举报
回复
System.Windows.Forms.Timer是单线程的。。。通俗的说使用这个计时器执行方法的时候画面会卡住

而另2个你不需要,为了执行效率,为其执行的方法开线程。

hainang1234 2006-01-20
  • 打赏
  • 举报
回复
呵呵,谢谢立冬夸奖:)

我也是认为应该用线程计时器,我有点担心在线程很多的时候计时器会不会变得很不精确。当然,测一下就知道了,有空了我去测一下。
lidong6 2006-01-20
  • 打赏
  • 举报
回复
很佩服楼主精益求精的精神,我以前也没区分过,因为没有这种需求.

我的理解是如果达到1000个以上的话,就应该使用占用资源较少的线程计时器
Comer 2006-01-20
  • 打赏
  • 举报
回复
关注
MyLf 2006-01-20
  • 打赏
  • 举报
回复
关注
hainang1234 2006-01-20
  • 打赏
  • 举报
回复
那么:
System.Timers.Timer会依赖于服务器?(windows server2000和windows server2003才可以?)
如果依赖服务器,那么是否可以减轻当前进程的负担?
是不是说System.Timers.Timer就是最耗资源的呢?
如果我要创建的计时器可能达1000个,是否应该使用System.Threading.Timer而不应该使用System.Timers.Timer呢?

我希望精确,但不能让系统崩溃,呵呵。谢谢大侠!
----楼主
echoxue 2006-01-20
  • 打赏
  • 举报
回复
xuexi
加载更多回复(2)

110,538

社区成员

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

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

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