.NET框架中Timer的可靠替代方案?

时间:2011-02-16 10:29:00

标签: c# .net asp.net vb.net

.Net中是否有替代Timer类的替代方法? 我们遇到System.Timers.Timer和System.Threading.Timer的问题,例如,它们会在一段时间不活动(49天后)后立即启动,或者有时会启动。 我已经看到他们似乎有很多问题,如:http://social.msdn.microsoft.com/Forums/en/netfxbcl/thread/dbc398a9-74c0-422d-89ba-4e9f2499a6a3
我们不能使用Forms计时器 我们打算暂停一段时间而不是计时器...

4 个答案:

答案 0 :(得分:6)

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

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

如果必须等待这么长时间,最好在你想要开始时计算DateTime。之后,您的任务每秒唤醒(或需要任何精度),并将当前时间与所需时间进行比较。如果当前时间相等或更大,那就开始工作吧。否则去睡觉(直到下一秒,小时,毫秒,等等)。顺便说一句,这就是Microsoft Task Scheduler的工作方式。

答案 1 :(得分:2)

我认为你需要System.Diagnostics.Stopwatch

  

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

答案 2 :(得分:0)

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

线程最有可能起作用,但它是否值得额外开销?

答案 3 :(得分:0)

我也意识到了这些限制,并实施了自己的计时器。很难接受这个决定,但到目前为止我并没有后悔。作为奖励,我自己的计时器实现了一个接口,以便使用计时器的类可以很容易地进行单元测试。

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

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