7

我有一个关于System.Timers.Timer在我的 .NET 应用程序中使用的问题。

我有三个不同的事件,一个每秒触发一次,另一个每分钟触发一次,最后一个每半小时触发一次。

从性能角度来看,拥有一个计时器还是三个计时器更好?

使用一个计时器的方法是检查ElapsedEventArgs' SignalTime 并将其与先前测量的时间进行比较。当然,如果您更改了 DateTime,这并不完全有效,但这不是这里的问题。基本上每一秒我都会检查一分钟或半小时是否已经过去......

我担心的是使用 3 个计时器会产生过多的开销。我错了,为了简单明了,我应该使用 3 还是 1 计时器就足够了?

代码:

private void TimerEverySecondElapsed(object sender, ElapsedEventArgs e)
    {
        timerEverySecond.Enabled = false;
        OnTimerElapsed(TimerType.EverySecond);

        // Raise an event every minute
        if ((e.SignalTime - previousMinute) >= minuteSpan)
        {
            OnTimerElapsed(TimerType.EveryMinute);
            previousMinute = e.SignalTime;
        }

        // Raise an event every half hour
        if ((e.SignalTime - previousHalfhour) >= semiHourSpan)
        {
            OnTimerElapsed(TimerType.EverySemiHour);
            previousHalfhour = e.SignalTime;
        }

        timerEverySecond.Enabled = true;
    }

minuteSpan并且semiHourSpan是只读的时间跨度。

4

3 回答 3

5

无论哪种方式,它都不会产生太大的影响。无论有多少定时器,后台都只有一个循环。效率最低的情况下,您将使用线程池中的 3 个线程,但可用的线程很多,所以这没什么大不了的。如果它使您的代码更易于阅读,我会说去吧。

但是请记住,这仅适用于Threading.Timer(AKA Timers.Timer)。Forms.Timer行为有点不同,最好只坚持其中一个,因为它只在 UI 线程上运行,所以你可能会遇到一些同步问题。

Threading.Timer 与 Forms.Timer

更多资源:

http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/f9a1c67d-8579-4baa-9952-20b3c0daf38a/

我可以创建多少个 System.Timers.Timer 实例?我可以扩展多远?

于 2012-12-06T11:24:17.790 回答
0

与 1 相比,3 计时器增加的开销非常小,而且代码很可能会好很多(在可读性和可维护性方面)

于 2012-12-06T11:22:57.043 回答
0

我认为使用 if 的检查比三个计时器的开销更大,此外,您可能会在尝试使用一个计时器时遇到一些奇怪的情况。

我会选择三个计时器。

于 2012-12-06T11:24:11.600 回答