Windows服务中使用不同计时器的不同线程

时间:2016-05-12 13:17:55

标签: c# multithreading timer

目前,我的服务中的函数在使用4.0框架编写的窗口服务中的定时器事件(每10分钟)的不同线程中调用,如下所示:

        public void OnTimer(object sender, System.Timers.ElapsedEventArgs args)
        {
                 Task.Factory.StartNew(() => ABC());
                 Task.Factory.StartNew(() => DEF());
                 Task.Factory.StartNew(() => GHI());
                 Task.Factory.StartNew(() => IJK());
                 Task.Factory.StartNew(() => LMN()); 
        }

我希望每个线程都有不同的时间间隔/计时器事件。一种可能的解决方案是创建新的计时器对象并在不同的计时器事件中调用每个函数还有其他优化方式吗? 将来,如果服务包含50个函数,那么我将不得不创建50个计时器对象。

1 个答案:

答案 0 :(得分:1)

编辑:Others have pointed out他们在应用程序中使用了数百个单独的计时器。如果定时器的数量不是系统限制,那么我不知道在多个间隔中重复使用一个定时器是否值得额外的复杂性。

创建一个每分钟都会过去的计时器。 (间隔是任意的,但一分钟可能更容易使用。)

当它过去时,确定经过的总分钟数。你可以用

做到这一点
var elapsedMinutes = (DateTime.Now - _startTime).TotalMinutes
// where _startTime is when the timer started

然后,例如,如果

(_elapsedMinutes % 10) == true
(_elapsedMinutes % 3) == true

然后计时器分别以10分钟或3分钟的间隔过去。

一个缺陷是,根据计时器过去和重新启动之间需要多长时间,您可能会损失几毫秒,这会在很长一段时间内累加一分钟,最终您可能会跳过一分钟。如果这是一个问题,那么当经过时间的秒部分接近整分钟时,你可以通过刮掉定时器间隔几秒钟来解释它。 (这有点乱。)