Skip to content

Commit

Permalink
Fixed a bug that the repeat timer does not work.
Browse files Browse the repository at this point in the history
  • Loading branch information
tosh-coding committed Jul 11, 2024
1 parent d3ebe52 commit 1c871a3
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 11 deletions.
18 changes: 11 additions & 7 deletions src/AsyncFiberWorks.Windows/Timer/IntervalWaitableTimerEx.cs
Original file line number Diff line number Diff line change
Expand Up @@ -78,14 +78,18 @@ public void ScheduleOnInterval(Action action, int firstIntervalMs, int intervalM
}

_waitableTimer.Set(firstIntervalMs * -10000L, intervalMs);
int index = WaitHandle.WaitAny(_waitHandles);
if (index == 0)
while (true)
{
copiedAction();
}
else
{
_waitableTimer.Cancel();
int index = WaitHandle.WaitAny(_waitHandles);
if (index == 0)
{
copiedAction();
}
else
{
_waitableTimer.Cancel();
break;
}
}

lock (_lockObj)
Expand Down
22 changes: 18 additions & 4 deletions src/AsyncFiberWorksTests/TimerActionTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,12 +38,26 @@ public void CallbackFromIntervalTimerWithCancel(Func<IIntervalTimer> timerCreato
long counterOnTimer = 0;
Action actionOnTimer = () => { counterOnTimer++; };
var cancellation = new CancellationTokenSource();
timer.ScheduleOnInterval(() => fiber.Enqueue(actionOnTimer), 2, 100, cancellation.Token);
int intervalMs = 300;
timer.ScheduleOnInterval(() => fiber.Enqueue(actionOnTimer), intervalMs / 2, intervalMs, cancellation.Token);

Thread.Sleep(40);
cancellation.Cancel();
Thread.Sleep(100);
Thread.Sleep(intervalMs);
Assert.AreEqual(1, counterOnTimer);
Thread.Sleep(intervalMs);
Assert.AreEqual(2, counterOnTimer);
Thread.Sleep(intervalMs);
Assert.AreEqual(3, counterOnTimer);
Thread.Sleep(intervalMs);
Assert.AreEqual(4, counterOnTimer);
Thread.Sleep(intervalMs);
Assert.AreEqual(5, counterOnTimer);
Thread.Sleep(intervalMs);
Assert.AreEqual(6, counterOnTimer);
cancellation.Cancel();
Thread.Sleep(intervalMs);
Assert.AreEqual(6, counterOnTimer);
Thread.Sleep(intervalMs);
Assert.AreEqual(6, counterOnTimer);
timer.Dispose();
}

Expand Down

0 comments on commit 1c871a3

Please sign in to comment.