У меня есть несколько таймеров в службе 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;
Как вы видите, у них разные интервалы, но в некоторых случаях операция занимает слишком много времени, и одновременно работают две таймеры одновременно, и это плохо.
Я пытаюсь использовать блоки 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();
}
}
Но никаких изменений в действии и нескольких таймеров не работают одновременно. Я хочу предотвратить действие других таймеров, если таймер выполняет работу.
Если вы хотите, чтобы одна вещь случалась одновременно, я бы предположил, что вместо всех этих таймеров вы просто запускаете один поток, запускает следующий псевдокод.
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
если это ваш предпочтительный способ сигнализировать об отключении потока, когда служба останавливается.
И теперь, очевидно, поскольку существует только один поток, который может вызвать любую из этих функций, нет необходимости использовать какую-либо другую форму взаимного исключения.
120000
все таймерыUpdate
,Delete
иHandshake
сработают одновременно. Что ты хочешь случиться тогда?