阻止Windows服务中的计时器

时间:2014-03-06 11:23:40

标签: c# windows-services

我目前在Windows服务中使用此“计时器代码”:

var autoEvent = new AutoResetEvent(false);
Timer = new Timer(DoWork, autoEvent, 0, TimeInMilliSeconds);

我只是想知道如果DoWork尚未完成,是否可以阻止调用DoWork?换句话说,如果TimeInMilliSeconds短于执行DoWork所需的时间?

2 个答案:

答案 0 :(得分:1)

如果我理解正确,那么您可以阻止自动回叫并在需要时更改计时器。

Timer = new Timer(DoWork, autoEvent, 0, Timeout.Infinite);//Prevent periodic timer

void DoWork(object state)
{
    //Do work and then set timer again
    timer.Change(TimeInMilliSeconds, Timeout.Infinite);
}

不要忘记添加try/finally阻止,如果你不这样做,你的计时器将不会再被调用。

答案 1 :(得分:1)

您可以完全避免使用计时器。在我的程序中,我在OnStop和OnPause方法中设置了停止和暂停事件。它们在OnStart和OnContinue方法中被清除。在这个例子中,我在循环之间等待30秒。

 WaitHandle[] waitFor = new WaitHandle[]{stopEvent, pauseEvent};
 int trigger = -1;
 bool keepGoing = true;
 while(keepGoing)
 {
     trigger = WaitHandle.WaitAny(waitFor, TimeSpan.FromSeconds(30));
     switch (trigger) {
         case WaitHandle.WaitTimeout:
            The main body of the loop goes here
            break;
         case 0: // stop
             keepGoing = false;
             break;
         case 1: // pause
             System.Diagnostics.Debug.Write("Paused - ");
             System.Diagnostics.Debug.WriteLine(DateTime.Now.ToString());
             break;
     }

修改的 如另一张海报的评论所述,这需要与您的主要服务分开。否则,您将永远不会处理停止,暂停或恢复事件。