我对我的.NET应用程序中System.Timers.Timer
的用法有疑问。
我有三个不同的事件,一个触发每秒一个,另一个触发每分钟,最后一个触发每半个小时。
有一个或三个计时器,性能更好吗?
使用一个计时器的方法是检查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
只是TimeSpans。
答案 0 :(得分:5)
不管怎么说都不会产生太大的影响。无论定时器的数量如何,后台只有一个循环。在它效率最低的情况下,您将使用线程池中的3个线程但是有一个 lot 可用,所以这不是什么大问题。如果它让你的代码更容易阅读,我会说它去吧。
请注意,这仅适用于Threading.Timer
(AKA Timers.Timer
)。 Forms.Timer
行为略有不同,因为它只能在UI线程上运行,因此可能会更好地坚持使用其中一个,因此您可能会遇到一些同步问题。
Threading.Timer vs. Forms.Timer
更多资源:
http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/f9a1c67d-8579-4baa-9952-20b3c0daf38a/
How many System.Timers.Timer instances can I create? How far can I scale?
答案 1 :(得分:0)
3计时器与1相比增加了很少的开销,代码很可能会更好(在可读性和可维护性方面)
答案 2 :(得分:0)
我认为使用if检查比三个计时器更多的开销,除了你可以在一些奇怪的情况下试图使用一个计时器。
我会选择三个计时器。