计时器以错误的间隔触发

本文关键字:错误 计时器 | 更新日期: 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
        }
    }