From 718089bda93d2cf2e0bf063dfdab1968dc0c4d25 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Sat, 18 Mar 2023 16:35:09 +0600 Subject: [PATCH] Fixed some timers --- src/Avalonia.Base/Threading/IDispatcherImpl.cs | 8 ++++++-- src/Avalonia.Controls/Platform/ManagedDispatcherImpl.cs | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/Avalonia.Base/Threading/IDispatcherImpl.cs b/src/Avalonia.Base/Threading/IDispatcherImpl.cs index ab501f698c..7f1e352b51 100644 --- a/src/Avalonia.Base/Threading/IDispatcherImpl.cs +++ b/src/Avalonia.Base/Threading/IDispatcherImpl.cs @@ -30,7 +30,7 @@ public interface IControlledDispatcherImpl : IDispatcherImplWithPendingInput void RunLoop(CancellationToken token); } -internal class LegacyDispatcherImpl : IControlledDispatcherImpl +internal class LegacyDispatcherImpl : DefaultDispatcherClock, IControlledDispatcherImpl { private readonly IPlatformThreadingInterface _platformThreading; private IDisposable? _timer; @@ -50,10 +50,14 @@ internal class LegacyDispatcherImpl : IControlledDispatcherImpl { _timer?.Dispose(); _timer = null; + if (dueTimeInMs.HasValue) + { + var interval = Math.Max(1, dueTimeInMs.Value - TickCount); _timer = _platformThreading.StartTimer(DispatcherPriority.Send, - TimeSpan.FromMilliseconds(dueTimeInMs.Value), + TimeSpan.FromMilliseconds(interval), OnTick); + } } private void OnTick() diff --git a/src/Avalonia.Controls/Platform/ManagedDispatcherImpl.cs b/src/Avalonia.Controls/Platform/ManagedDispatcherImpl.cs index 7a487e99fb..54c96113ea 100644 --- a/src/Avalonia.Controls/Platform/ManagedDispatcherImpl.cs +++ b/src/Avalonia.Controls/Platform/ManagedDispatcherImpl.cs @@ -46,7 +46,7 @@ public class ManagedDispatcherImpl : IControlledDispatcherImpl { _nextTimer = dueTimeInMs == null ? null - : _clock.Elapsed + TimeSpan.FromMilliseconds(dueTimeInMs.Value); + : TimeSpan.FromMilliseconds(dueTimeInMs.Value); if (!CurrentThreadIsLoopThread) _wakeup.Set(); }