我有一个应用程序,它使用System.Timers.Timer
个对象来进行过期和电子邮件通知等。目前该系统有一百个计时器同时存在,但我们将扩大应用程序的使用量,这个数字可能会开始扩展到数千(可能不高于10,000)。
我无法找到有关扩大计时器数量的任何信息,所以我认为它不会成为问题。有谁知道这是否会成为一个问题,我应该主动考虑改变我处理过期的方式?
答案 0 :(得分:11)
有点晚了,我知道,但是。 。
System.Timers.Timer
是System.Threading.Timer
的包装器,而后者是围绕Windows Timer Queues的.NET包装器。定时器队列定时器非常轻量级 - 使用很少的系统资源。我没有扩展到成千上万的计时器,但数百个计时器工作正常。从我能够收集到的实现中,我无法想象成千上万的计时器会有任何问题。
对于任何特定计时器队列中的计时器数量,可能存在一些限制。我不知道那个限制是什么。当我在大约一年前调查这些计时器时,看起来.NET Framework每个进程创建一个计时器队列(或者可能是每个应用程序域),并且您创建的所有计时器都被放入该队列中。
通过创建自己的系统来复制定时器队列功能可能没有意义,该系统使用单个定时器和某种类型的优先级队列机制来控制接下来要调用的内容。这就是计时器队列为你做的事情。
您似乎可以轻松构建一个可创建10,000个计时器的测试程序。将每一个设置为在最后一个之后打勾一秒,并将其周期设置为10,000秒。然后坐下来观看它。或者让你的程序跟踪下一个应该打勾的人以及接下来实际打勾的人。
答案 1 :(得分:1)
只使用一个计时器不是更好吗?这个定时器触发 e。 G。每秒或每分钟,然后将 DateTime.Now() 与计划的 Setpoint DateTime 对象进行比较。 如果 Setpoint DateTime 对象与 DateTime.Now() 匹配,则触发事件并重新计算对象的下一次执行日期时间。
答案 2 :(得分:0)
如何只使用一个计时器?计时器将在第一次到期时到期,并在到期时执行适当的逻辑。然后将其间隔重置为下一个到期时间?也许只使用一个计时器来处理到期的另一种方式。
答案 3 :(得分:0)
如果您有兴趣,请查看计时器类依赖的基本OS资源,方法是在系统DLL上使用Reflector。
然后向Mark Russinovich提出问题 http://blogs.technet.com/b/markrussinovich/
答案 4 :(得分:0)
你应该很好地使用它们。但就像pdiddy所说,如果可以的话,你真的应该考虑改变你的代码。 1对10.000计时器有所不同。 ; - )