【问题标题】:Reliable alternative to Timer in .NET framework?.NET 框架中 Timer 的可靠替代方案?
【发布时间】:2011-02-16 10:28:59
【问题描述】:

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

【问题讨论】:

  • 您是否考虑过将任务计划程序用于长时间重复的活动?与框架计时器不同,这将在重新启动(例如补丁星期二)后起作用。

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    我认为你需要System.Diagnostics.Stopwatch

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

    【讨论】:

    • 秒表用于测量某件事需要多长时间,它不会在指定时间后启动某个进程。
    • 同意,我建议使用带有@Oliver 方法的秒表(有时醒来并检查经过的时间)。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      我也意识到了这些限制,并实现了自己的计时器。很遗憾做出这个决定,但到目前为止我还没有后悔过。作为奖励,我自己的计时器实现了一个接口,因此可以轻松地对使用计时器的类进行单元测试。

      一些 .NET 计时器还存在一个问题,即它们可能会在最后一个回调完成之前调用回调。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-03
        • 1970-01-01
        • 2010-11-09
        • 2022-01-13
        • 2014-08-14
        • 1970-01-01
        • 2010-09-07
        相关资源
        最近更新 更多