DTLib/DTLib/Timer.cs
2024-09-20 00:27:57 +05:00

46 lines
1.2 KiB
C#

using System.Threading;
namespace DTLib;
//
// простой и понятный класс для выполнения каких-либо действий в отдельном потоке раз в некоторое время
//
public class Timer
{
private Task _timerTask;
private CancellationTokenSource _cts = new();
private bool _repeat;
private int _delayMs;
private Action _action;
// таймер сразу запускается
public Timer(bool repeat, int delayMs, Action action)
{
_repeat = repeat;
_delayMs = delayMs;
_action = action;
_timerTask = new Task(Loop, _cts.Token);
}
private void Loop()
{
do
{
if (_cts.Token.IsCancellationRequested)
return;
Task.Delay(_delayMs).Wait();
if (_cts.Token.IsCancellationRequested)
return;
_action?.Invoke();
} while (_repeat);
}
public void Start() => _timerTask.Start();
// завершение потока
public void Stop()
{
_cts.Cancel();
}
}