Я хочу создать службу 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++;
}
}
Заранее большое спасибо!
Мы очень признательны за любую помощь!
static
для данных, которые должны быть специфичными для экземпляра (как в данном случае должно бытьm_synchPoint
). - person bobbymcr   schedule 11.12.2011workerThread.Start
, а затем сразуworkerThread.Join
? Нет смысла делать что-то таким образом, поскольку поток таймера просто будет ждать, пока не завершится новый поток. ВыполнитеaMethod
напрямую и избавьте себя от накладных расходов на запуск нового потока. - person Jim Mischel   schedule 11.12.2011aMethod
, запустите поток и дождитесь его завершения, полностью исключите поток и просто вызовитеaMethod
напрямую. - person Jim Mischel   schedule 11.12.2011aMethod
непосредственно из тика таймера, такт таймера не завершится до выходаaMethod
. В конце концов, это всего лишь код. Если вы вызываете метод в потоке, даже в такт таймера, этот метод должен завершиться до того, как вызывающая сторона сможет продолжить работу. - person Jim Mischel   schedule 12.12.2011