using System; using System.Threading; using System.Threading.Tasks; using Avalonia.Threading; namespace dmeo040225.Services; public class TimerService { private TimeSpan _timeRemaining = TimeSpan.FromMinutes(20); private CancellationTokenSource _cts = new(); public event Action? TimeUpdated; public event Action? TimerExpired; private static TimerService? _instance; public static TimerService Instance => _instance ??= new TimerService(); private TimerService() { } public void Start() { _cts.Cancel(); _cts = new CancellationTokenSource(); Task.Run(async () => { while (_timeRemaining > TimeSpan.Zero) { await Task.Delay(TimeSpan.FromSeconds(1), _cts.Token); _timeRemaining -= TimeSpan.FromSeconds(1); Dispatcher.UIThread.Post(() => TimeUpdated?.Invoke(_timeRemaining)); } Dispatcher.UIThread.Post(() => TimerExpired?.Invoke()); }, _cts.Token); } public void Reset() { _timeRemaining = TimeSpan.FromMinutes(20); } public void Stop() { _cts.Cancel(); } }