定时器在运行Windows服务时触发两次

本文关键字:两次 运行 Windows 服务 定时器 | 更新日期: 2023-09-27 17:53:40

服务运行时,程序运行两次。平均运行时间为10分钟。

private void InitializeTimer()
{
    var confcontr = new ConfigurationController();
    var config = confcontr.ReadConfiguration();
    try
    {
        if (serviceTimer != null)
        {
            serviceTimer.AutoReset = true;
            Articles art = new Articles(config);
            //Conexion a a los articulos de BD para obtener parametros de iniciación 
            serviceTimer.Interval = Convert.ToDouble(60*1000)* art.Parameter();
            //Se especifica cada que tanto tiempo se ejecuta el servicio
            serviceTimer.Enabled = true;
            serviceTimer.Elapsed += serviceTimer_Elapsed;
        }
    }
    catch (Exception ex)
    {
       Log.Instance.WriteToLog(ex.Message + ex.StackTrace + "initializetimer");
    }
}

这是我要调用的方法

protected void serviceTimer_Elapsed(object sender, ElapsedEventArgs e)
{
    var artcont = new ArticulosController();
    artcont.EjecutarArticulo();
}

定时器在运行Windows服务时触发两次

计时器将通过使用ThreadPool线程引发事件来异步执行Elapsed事件,因此它可以重叠。

而不是关闭AutoReset,并尝试这样做:

protected void serviceTimer_Elapsed(object sender, ElapsedEventArgs e)
{
    var artcont = new ArticulosController();
    artcont.EjecutarArticulo();
    ((Timer)sender).Start();
}

一旦当前Elapsed事件完成,将重新启动计时器。

我将重写您的方法来构造计时器。没有任何保护的事件订阅可能会被订阅多次。当您在类之外使用您的代码或其他开发人员使用它时尤其如此。作为一种替代方法,您还可以在适当的位置放置一个isinitialized变量。如果需要线程安全,请使用锁。如果需要对其他进程进行保护,可以使用互斥锁。如果Elapsed方法长时间运行,停止计时器并在完成后重新启动它,这样事件就不会"堆积"。初始化时,添加订阅后启动定时器。

private void InitializeTimer()
{
    var confcontr = new ConfigurationController();
    var config = confcontr.ReadConfiguration();
    try
    {
        if (serviceTimer == null)
        {
            serviceTimer = new System.Timers.Timer();
            serviceTimer.AutoReset = true;
            Articles art = new Articles(config);
            //Conexion a a los articulos de BD para obtener parametros de iniciación 
            serviceTimer.Interval = Convert.ToDouble(60 * 1000) * art.Parameter();
            //Se especifica cada que tanto tiempo se ejecuta el servicio
            serviceTimer.Elapsed += serviceTimer_Elapsed;
            serviceTimer.Enabled = true;
        }
    }
    catch (Exception ex)
    {
        Log.Instance.WriteToLog(ex.Message + ex.StackTrace + "initializetimer");
    }
}
protected void serviceTimer_Elapsed(object sender, ElapsedEventArgs e)
{
    serviceTimer.Enabled = false;
    try
    {
        var artcont = new ArticulosController();
        artcont.EjecutarArticulo();
    }
    catch (Exception ex)
    {
        Log.Instance.WriteToLog(ex.Message + ex.StackTrace + "serviceTimer_Elapsed");
    }
    serviceTimer.Enabled = true;
}