// Создаем таймер из System.Threading
Timer timer = new Timer(OnTimer, state: null, dueTime: 0, period: 1000);
static void OnTimer(object state)
{
Thread.Sleep(5000); // Симуляция работы
}
// Создаем таймер
timer = new System.Timers.Timer(1000);
timer.Elapsed += Timer_Elapsed;
timer.Start();
private static void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
timer.Stop(); // Останавливаем таймер чтобы он не вызвался второй раз через секунду.
Thread.Sleep(5000); // Симуляция работы
timer.Start();
}
public class TestWorker
{
private readonly Timer _timer;
public TestWorker()
{
_timer = new Timer(
Callback,
null,
TimeSpan.FromSeconds(1),
TimeSpan.Zero);
}
private void Callback(object state)
{
try
{
//work imitation
Thread.Sleep(5000);
}
finally
{
_timer.Change(
TimeSpan.FromSeconds(1),
TimeSpan.Zero);
}
}
}
public class WorkTimer : Disposable
{
private readonly System.Threading.Timer timer;
private readonly TimerCallback timerCallback;
private int interval;
private bool timerIsCalling = false;
public WorkTimer(TimerCallback callback, object state, int dueTime, int interval)
{
timerCallback = callback;
Interval = interval;
timer = new System.Threading.Timer(Callback, state, dueTime, Interval);
}
protected override void ReleaseUnmanagedResources()
{
timer?.Dispose();
}
public int Interval
{
get { OnCallAnyMethod(); return interval; }
set {
OnCallAnyMethod();
interval = value;
if (!timerIsCalling)
timer?.Change(value, value);
}
}
private void Callback(object state)
{
timerIsCalling = true;
timer.Change(-1, -1); // Stop timer
this.timerCallback(state);
timer.Change(Interval, Interval); // Resume timer
timerIsCalling = false;
}
}