46 lines
1.2 KiB
C#
46 lines
1.2 KiB
C#
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<TimeSpan>? 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();
|
|
}
|
|
} |