1

この記事に基づいて 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 秒ごとに起動することを意味する必要があります。

ただし、コードは1秒ごとに起動しています

私は何を間違えましたか

 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();
            }
        }
    }
4

1 に答える 1

3

TimerExecute にヒットするたびにタイマーを再起動します。そして、それはうまく再起動するので、1秒後に再びトリガーされます。したがって、TimerExecute をこれに書き換えます。

また、 try catch または try finally メソッドを使用して、問題を無視するだけでなく、実際に問題をキャッチして何らかの方法で処理するようにしてください。

private void TimerExecute()
    {
        try
        {
            timerAction();
        }
        catch
        {
            //todo
        }
    }
于 2012-05-09T12:00:08.143 に答える