计时器以错误的间隔触发
本文关键字:错误 计时器 | 更新日期: 2023-09-27 18:33:33
我正在尝试根据本文抽象system.threading.timer:http://www.derickbailey.com/CommentView,guid,783f22ad-287b-4017-904c-fdae46719a53.aspx
但是,计时器似乎根据错误的参数触发
在下面的类中,我们有这一行
timer = new System.Threading.Timer(o => TimerExecute(), null, 1000, 30000);
这应该意味着在启动前等待 1 秒,然后每 30 秒触发一次
但是,代码每秒触发一次
我做错了什么
public interface ITimer
{
void Start(Action action);
void Stop();
}
public class Timer : ITimer, IDisposable
{
private TimeSpan timerInterval;
private System.Threading.Timer timer;
private Action timerAction;
private bool IsRunning { get; set; }
public Timer(TimeSpan timerInterval)
{
this.timerInterval = timerInterval;
}
public void Dispose()
{
StopTimer();
}
public void Start(Action action)
{
timerAction = action;
IsRunning = true;
StartTimer();
}
public void Stop()
{
IsRunning = false;
StopTimer();
}
private void StartTimer()
{
timer = new System.Threading.Timer(o => TimerExecute(), null, 1000, Convert.ToInt32(timerInterval.TotalMilliseconds));
}
private void StopTimer()
{
if (timer != null)
{
timer.Change(Timeout.Infinite, Timeout.Infinite);
timer.Dispose();
timer = null;
}
}
private void TimerExecute()
{
try
{
StopTimer();
timerAction();
}
finally
{
if (IsRunning)
StartTimer();
}
}
}
每次
命中 TimerExecute 时都会重新启动计时器。而且由于它重新启动良好,它将在 1 秒后再次触发。所以我会重写 TimerExecute 到这个。
此外,您的尝试捕获或最终尝试方法,确保您确实抓住了问题并以某种方式处理它们,而不仅仅是忽略它。
private void TimerExecute()
{
try
{
timerAction();
}
catch
{
//todo
}
}