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