2011-02-16 63 views
1

在.net中有替代Timer类的替代吗?
我们遇到了System.Timers.Timer和System.Threading.Timer的问题,例如,它们开始敏捷,或者有时会在长时间不活动(49天后)后熄灭。
我已经看到,似乎有像他们这样的很多问题:http://social.msdn.microsoft.com/Forums/en/netfxbcl/thread/dbc398a9-74c0-422d-89ba-4e9f2499a6a3
我们不能使用Forms计时器。
我们正在考虑暂停线程一段时间而不是定时器....NET框架中Timer的可靠替代方案?

+1

您是否考虑过使用任务计划程序进行长时间重复的活动?与框架计时器不同,这将在重新启动(例如星期二补丁)中工作。 – Richard 2011-02-16 10:49:03

回答

6

This article描述了.Net框架中定时器类之间的区别。

但也许另一种方法可以帮助:

如果必须要等待这么长的时间,将是更好的计算DateTime当你喜欢的东西开始。之后,您的任务每秒醒来(或需要任何准确度)并将当前时间与所需时间进行比较。如果当前时间相同或更长,就开始工作。否则去睡觉(直到下一秒,小时,毫秒,不管)。顺便说一下,这就是Microsoft Task Scheduler的工作方式。

0

您可以在Tick/Elapsed事件处理程序中每48天用一个新实例替换计时器。

线程很可能会工作,但它是否值得额外的开销?

0

我也意识到这些限制并实现了自己的计时器。被迫采取这一决定,但我迄今没有后悔。作为奖励,我自己的计时器实现了一个接口,以便使用计时器的类可以轻松进行单元测试。

一些.NET定时器也有问题,他们可能会在最后一次回调完成之前调用回调。

我建议把定时器逻辑放在它自己的类中,而不是暂停一个线程。

2

我认为你需要System.Diagnostics.Stopwatch

秒表通过计算基础定时器机制中的计时器滴答来测量已用时间。如果安装的硬件和操作系统支持高分辨率性能计数器,则秒表类会使用该计数器来测量已用时间。否则,秒表类会使用系统计时器来测量已用时间。 使用Frequency和IsHighResolution字段来确定秒表计时实施的精度和分辨率。

+2

秒表用于测量某物需要多长时间,但在指定时间后它不会启动某个过程。 – 2011-02-16 11:46:04