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
}