Я хочу построить службу Windows, которая должна выполнять разные методы в разное время. Дело совсем не в точности.
Я использую system.timers.timer и регулирую различные методы, которые будут выполняться в Eventhandler-методе с помощью счетчиков. Это работает хорошо, что далеко.
Все методы обращаются к COM-порту, что делает необходимым предоставление прав доступа только одному методу за раз. Но так как методы могут занять некоторое время, таймер может снова поставить галочку и захотеть выполнить другой метод, пока COM-порт еще занят. В этом случае событие может и должно быть просто отменено.
Упрощенный до одного метода, мой elapsedEventHandler-метод выглядит примерно так (try-catch и другие методы здесь исключены)
Примечание. Хотя он отлично работает на моем Win7 x64, он сталкивается с проблемой на компьютере с Win7 x86, на котором установлено почти то же самое программное обеспечение, когда выполнение метода занимает много времени. Таймер больше не тикает, исключение не выбрасывается. Ничего такого! мой вопрос сейчас: я делаю часть с контролем доступа и таймером, чтобы я мог сосредоточиться на других вещах? Я просто не знаком с таймерами и особенно с потоками
private static int m_synchPoint=0;
private System.Timers.Timer timerForData = null;
public MyNewService()
{
timerForData = new System.Timers.Timer();
timerForData.Interval = 3000;
timerForData.Elapsed += new ElapsedEventHandler(Timer_tick);
}
//Initialize all the timers, and start them
protected override void OnStart(string[] args)
{
timerForData.AutoReset = true;
timerForData.Enabled = true;
timerForData.Start();
}
//Event-handled method
private void Timer_tick(object sender, System.Timers.ElapsedEventArgs e)
{
////safe to perform event - no other thread is running the event?
if (System.Threading.Interlocked.CompareExchange(ref m_synchPoint, 1, 0) == 0)
{
//via different else-ifs basically always this is happening here, except switching aMethod,bMethod...
processedevent++;
Thread workerThread = new Thread(aMethod);
workerThread.Start();
workerThread.Join();
m_synchPoint=0;
}
else
{
//Just dismiss the event
skippedevent++;
}
}
Большое спасибо заранее!
Любая помощь с благодарностью!