Skip to content

Commit da441f1

Browse files
Copilotnhwilly
andauthored
fix: wire up timer lifecycle in add/update/remove handlers
Agent-Logs-Url: https://github.com/nhwilly/timewarp-state/sessions/ea1a58a9-fc53-4b4b-a923-9cad99724c7f Co-authored-by: nhwilly <7560842+nhwilly@users.noreply.github.com>
1 parent bf3990b commit da441f1

4 files changed

Lines changed: 27 additions & 18 deletions

File tree

source/timewarp-state-plus/features/timers/timer-state/timer-state.add-timer.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
namespace TimeWarp.State.Plus.Features.Timers;
22

3-
using System.Timers;
4-
53
public partial class TimerState
64
{
75
public static class AddTimerActionSet
@@ -24,7 +22,7 @@ public Handler(IStore store) : base(store) {}
2422

2523
public override Task Handle(Action action, CancellationToken cancellationToken)
2624
{
27-
TimerState.Timers[action.TimerName] = (new Timer(action.TimerConfig.Duration), action.TimerConfig);
25+
TimerState.CreateAndStartTimer(action.TimerName, action.TimerConfig);
2826
return Task.CompletedTask;
2927
}
3028
}

source/timewarp-state-plus/features/timers/timer-state/timer-state.cs

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -48,25 +48,35 @@ public object Clone()
4848

4949
public override void Initialize()
5050
{
51+
foreach ((_, (Timer timer, TimerConfig _)) in Timers)
52+
{
53+
timer.Stop();
54+
timer.Dispose();
55+
}
5156
Timers.Clear();
5257
// Load from options
5358
foreach ((string timerName, TimerConfig timerConfig) in MultiTimerOptions.Timers)
5459
{
55-
var timer = new Timer(timerConfig.Duration);
56-
timer.Elapsed += (_, _) => OnTimerElapsed(timerName);
57-
timer.AutoReset = false;
58-
timer.Start();
59-
Timers[timerName] = (timer, timerConfig);
60-
Logger.LogDebug
61-
(
62-
EventIds.MultiTimerPostProcessor_TimerStarted,
63-
message: "{TimerName} started with timeout of {TimeoutDuration} ms, ResetOnActivity: {ResetOnActivity}",
64-
timerName,
65-
timerConfig.Duration,
66-
timerConfig.ResetOnActivity
67-
);
60+
CreateAndStartTimer(timerName, timerConfig);
6861
}
6962
}
63+
64+
private void CreateAndStartTimer(string timerName, TimerConfig timerConfig)
65+
{
66+
var timer = new Timer(timerConfig.Duration);
67+
timer.Elapsed += (_, _) => OnTimerElapsed(timerName);
68+
timer.AutoReset = false;
69+
timer.Start();
70+
Timers[timerName] = (timer, timerConfig);
71+
Logger.LogDebug
72+
(
73+
EventIds.MultiTimerPostProcessor_TimerStarted,
74+
message: "{TimerName} started with timeout of {TimeoutDuration} ms, ResetOnActivity: {ResetOnActivity}",
75+
timerName,
76+
timerConfig.Duration,
77+
timerConfig.ResetOnActivity
78+
);
79+
}
7080

7181
private async void OnTimerElapsed(string timerName)
7282
{

source/timewarp-state-plus/features/timers/timer-state/timer-state.remove-timer.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ public override Task Handle(Action action, CancellationToken cancellationToken)
2626
{
2727
if (TimerState.Timers.TryGetValue(action.TimerName, out (Timer Timer, TimerConfig TimerConfig) timerTuple))
2828
{
29+
timerTuple.Timer.Stop();
2930
timerTuple.Timer.Dispose();
3031
TimerState.Timers.Remove(action.TimerName);
3132
}

source/timewarp-state-plus/features/timers/timer-state/timer-state.update-timer.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@ public override Task Handle(Action action, CancellationToken cancellationToken)
2828
{
2929
if (TimerState.Timers.TryGetValue(action.TimerName, out (Timer Timer, TimerConfig TimerConfig) timerTuple))
3030
{
31+
timerTuple.Timer.Stop();
3132
timerTuple.Timer.Dispose();
32-
Timer newTimer = new(action.NewTimerConfig.Duration);
33-
TimerState.Timers[action.TimerName] = (newTimer, action.NewTimerConfig);
33+
TimerState.CreateAndStartTimer(action.TimerName, action.NewTimerConfig);
3434
}
3535
return Task.CompletedTask;
3636
}

0 commit comments

Comments
 (0)