diff --git a/src/Core/ZB.MOM.WW.OtOpcUa.Core.ScriptedAlarms/ScriptedAlarmEngine.cs b/src/Core/ZB.MOM.WW.OtOpcUa.Core.ScriptedAlarms/ScriptedAlarmEngine.cs index 6ce5e52..e42b629 100644 --- a/src/Core/ZB.MOM.WW.OtOpcUa.Core.ScriptedAlarms/ScriptedAlarmEngine.cs +++ b/src/Core/ZB.MOM.WW.OtOpcUa.Core.ScriptedAlarms/ScriptedAlarmEngine.cs @@ -165,6 +165,11 @@ public sealed class ScriptedAlarmEngine : IDisposable _loaded = true; _engineLogger.Information("ScriptedAlarmEngine loaded {Count} alarm(s)", _alarms.Count); + // Dispose any previously-created timer before reassigning; a second LoadAsync + // call without this would leave two timers firing against the same engine. + // (Core.ScriptedAlarms-002) + _shelvingTimer?.Dispose(); + // Start the shelving-check timer — ticks every 5s, expires any timed shelves // that have passed their UnshelveAtUtc. _shelvingTimer = new Timer(_ => RunShelvingCheck(),