2012-05-09 3 views
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 секунд

Однако код стреляет каждый второй

, что я сделал неправильно

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

Вы передаете timerInterval в класс Timer и используете это позже, чтобы установить интервал повтора. Какова ценность timerInterval? –

+0

Я изменил код на твердое кодированное значение, чтобы вставить его здесь. Угадайте, что только что вызвало путаницу, хотя – ChrisCa

ответ

3

Вы перезапускает таймер каждый раз, когда она попадает TimerExecute. И так как он перезагрузится, он снова запустится через 1 секунду. Поэтому я бы переписал TimerExecute.

Также вы пытаетесь поймать или попробовать в конце концов методы, убедитесь, что вы действительно поймаете проблемы и обработаете их каким-то образом, а не просто игнорируете их.

private void TimerExecute() 
    { 
     try 
     { 
      timerAction(); 
     } 
     catch 
     { 
      //todo 
     } 
    } 
Смежные вопросы