在Windows服务问题中使用多个System.Timers

时间:2014-07-22 09:46:33

标签: c# multithreading timer windows-services

我在Windows服务中有多个计时器用于某些不同的东西:

        timerForUpdate = new Timer();
        timerForSyncByServer = new Timer();
        timerForGetFactors = new Timer();
        timerForDelete = new Timer();
        timerForHandshaking = new Timer();
        timerForConfig = new Timer();

        timerForSyncByServer.Interval = 35000;
        timerForUpdate.Interval = 40000;
        timerForDelete.Interval = 30000;
        timerForGetFactors.Interval = 200000;
        timerForHandshaking.Interval = 60000;
        timerForConfig.Interval = 10000;

如你所见,它们有不同的间隔,但有时候操作需要的时间太长而且2个计时器同时在一起工作,这很糟糕。

我尝试使用lock块来处理问题:

 public object CrossTimer = new object();
 void timerForConfig_Elapsed(object sender, ElapsedEventArgs e)
        {
            lock (CrossTimer)
            {
                ConfigOperation.UpdateWebConfig();
            }
        }

        void timerForHandshaking_Elapsed(object sender, ElapsedEventArgs e)
        {
            lock (CrossTimer)
            {
                HandshakeOperations.ShakeHand();
            }
        }

        void timerForDelete_Elapsed(object sender, ElapsedEventArgs e)
        {
            lock (CrossTimer)
            {
                FoodTypesOperations.DeleteWebDB();
                KalaToleedOperations.DeleteWebDB();
            }
        }
        void timerForGetFactors_Elapsed(object sender, ElapsedEventArgs e)
        {
            lock (CrossTimer)
            {
                FactorOperations.GetLastFactors();
            }
        }

但是行动没有变化,多个计时器同时工作。 如果计时器正在工作,我想阻止其他计时器的动作。

1 个答案:

答案 0 :(得分:2)

如果您一次只想要发生一件事,那么我建议您只需启动一个线程,而不是所有这些定时器,运行以下伪代码。

Initialize count to 0
Initialize rundate to Now()
While(true)
    count++
    if(count==840) count = 0
    if(count%7==0) DoSyncByServer()
    if(count%8==0) DoUpdate()
    if(count%6==0) DoDelete()
    if(count%40==0) DoFactors()
    if(count%12==0) DoHandshake()
    if(count%2==0) DoConfig()
    rundate += 5 seconds
    interval = Now() - rundate
    if(interval > 0)
       sleep(interval)
    end if
end while

while(true)可以更改为WaitOne(0) ManualResetEvent,如果这是您在服务停止时向线程发出关闭信号的首选方式。

现在,显然,由于只有一个线程可以调用任何这些功能,因此不需要使用任何其他形式的互斥。