定时器在运行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();
}
计时器将通过使用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;
}