c# Windows Service计时器滴答不止一个

本文关键字:一个 不止 Windows Service 计时器 滴答 | 更新日期: 2023-09-27 18:04:56

我试图使一个服务,应该执行我的代码后,每秒钟我的代码执行结束。但是当我启动服务并调试它时,计时器滴答不止一个,我的意思是,我的代码在第一次执行结束之前执行了两次。

这是我的代码;

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如果块…

c# Windows Service计时器滴答不止一个

假设你使用的是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
}