C# Windows 服务计时器滴答不止一个
C# Windows Service timer ticks more than one
我正在尝试制作一种服务,该服务应在我的代码执行结束后每秒执行一次我的代码。但是当我启动服务并调试它时,计时器滴答不止一次,我的意思是,我的代码在第一次执行结束之前执行了两次。
这是我的代码;
Timer timer1 = new Timer(1000);
bool _service_working = false;
protected override void OnStart(string[] args)
{
timer1.Elapsed += new ElapsedEventHandler(runProcess);
timer1.Enabled = true;
timer1.Start();
_service_working = false;
}
protected override void OnStop()
{
timer1.Enabled = false;
}
private void runProcess(object sender, ElapsedEventArgs e)
{
try
{
if (_service_working == false)
{
timer1.Enabled=false;
_service_working = true;
}
#region myCodes
}
catch (Exception ex)
{
_logService.insert_log(1022, 2, ex.Message, "Path : runProcess");
}
finally
{
_service_working = false;
timer1.Enabled = true;
}
}
当我调试它时,计时器在 runProcess if block 时再次计时...
假设您正在使用 System.Timers.Timer
,那么 Timer
事件通常在后台线程中引发,这意味着在没有任何锁定的情况下,您的计时器事件方法可以重叠。
一个简单的解决方案是将 AutoReset
设置为 false
,然后在您的计时器事件中重新启动它,例如:
private bool terminating;
public Service()
{
terminating = false;
timer = new Timer(1000);
timer.Elapsed += new ElapsedEventHandler(runProcess);
timer.Enabled = true;
timer.AutoReset = false;
}
protected override void OnStart(string[] args)
{
timer.Start();
}
protected override void OnStop()
{
terminating = true;
timer1.Stop();
}
private void runProcess(object sender, ElapsedEventArgs e)
{
// Do stuff
if (!terminating)
timer.Start(); // Restart timer
}
我正在尝试制作一种服务,该服务应在我的代码执行结束后每秒执行一次我的代码。但是当我启动服务并调试它时,计时器滴答不止一次,我的意思是,我的代码在第一次执行结束之前执行了两次。
这是我的代码;
Timer timer1 = new Timer(1000);
bool _service_working = false;
protected override void OnStart(string[] args)
{
timer1.Elapsed += new ElapsedEventHandler(runProcess);
timer1.Enabled = true;
timer1.Start();
_service_working = false;
}
protected override void OnStop()
{
timer1.Enabled = false;
}
private void runProcess(object sender, ElapsedEventArgs e)
{
try
{
if (_service_working == false)
{
timer1.Enabled=false;
_service_working = true;
}
#region myCodes
}
catch (Exception ex)
{
_logService.insert_log(1022, 2, ex.Message, "Path : runProcess");
}
finally
{
_service_working = false;
timer1.Enabled = true;
}
}
当我调试它时,计时器在 runProcess if block 时再次计时...
假设您正在使用 System.Timers.Timer
,那么 Timer
事件通常在后台线程中引发,这意味着在没有任何锁定的情况下,您的计时器事件方法可以重叠。
一个简单的解决方案是将 AutoReset
设置为 false
,然后在您的计时器事件中重新启动它,例如:
private bool terminating;
public Service()
{
terminating = false;
timer = new Timer(1000);
timer.Elapsed += new ElapsedEventHandler(runProcess);
timer.Enabled = true;
timer.AutoReset = false;
}
protected override void OnStart(string[] args)
{
timer.Start();
}
protected override void OnStop()
{
terminating = true;
timer1.Stop();
}
private void runProcess(object sender, ElapsedEventArgs e)
{
// Do stuff
if (!terminating)
timer.Start(); // Restart timer
}