我目前在Windows服务中使用此“计时器代码”:
var autoEvent = new AutoResetEvent(false);
Timer = new Timer(DoWork, autoEvent, 0, TimeInMilliSeconds);
我只是想知道如果DoWork尚未完成,是否可以阻止调用DoWork?换句话说,如果TimeInMilliSeconds短于执行DoWork所需的时间?
答案 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;
}
修改的 如另一张海报的评论所述,这需要与您的主要服务分开。否则,您将永远不会处理停止,暂停或恢复事件。