我在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();
}
}
但是行动没有变化,多个计时器同时工作。 如果计时器正在工作,我想阻止其他计时器的动作。
答案 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
,如果这是您在服务停止时向线程发出关闭信号的首选方式。
现在,显然,由于只有一个线程可以调用任何这些功能,因此不需要使用任何其他形式的互斥。