2013-02-22 2 views
0

Я кодирую проект службы Windows, я использую System.Timers.Timer для некоторой работы..net3.5 System.Timers.Timer.Elapsed Twice

Я установил интервал 2000 миллисекунд.

Но я обнаружил, что таймер будет увеличивать событие Истекшее время 1 в первые 2000 миллисекунд, а затем дважды поднимать событие с удлинением на каждые 2000 миллисекунд.

Я думаю, что есть что-то не так с моей программой, я постараюсь решить эту проблему с помощью замка:

var timer_lock = new object(); 
DateTime last_elapse_time = DateTime.MinValue; 
var _tm = new System.Timers.Timer(2000); 
_tm.Elapsed += (object sender, System.Timers.ElapsedEventArgs e) => 
{ 
    lock (timer_lock) 
    { 
     var cur_time = DateTime.Now; 
     var interval = (cur_time - last_elapse_time).TotalMilliseconds; 
     if (interval < 2000) 
      return; 
     last_elapse_time = cur_time; 
     System.Diagnostics.Trace.WriteLine(cur_time.Second); 
    }; 
} 
_tm.Start(); 

Но я нашел, что это не работает, Trace.WriteLine работает в два раза, а затем я попробовал еще один тест:

static void Main() 
{ 
    new System.Threading.Thread(new System.Threading.ThreadStart(() => { 
     while (true) 
     { 
      System.Threading.ThreadPool.QueueUserWorkItem((object context) => 
      { 
       var cur_time = DateTime.Now; 
       System.Diagnostics.Trace.WriteLine(cur_time.Second); 
      }); 
      System.Threading.Thread.Sleep(2000); 
     } 
    })).Start(); 
} 

Но ничего не меняется ..

Я делаю новый проект консоли, чтобы проверить эту проблему, то проблема исчезает, таймер работает хорошо.

Затем я создаю новый проект службы Windows, тогда проблема возникает снова.

Я отлаживаю проект службы окон запустил OnStart() метод в Main(), это причина?

+0

Код выглядит сломанным, когда таймер является локальной переменной. Это означает, что вы никогда не сможете остановить таймер, чтобы вы не могли правильно реализовать OnStop(). Начните более одного раза, что вы делаете, также называя его от Main(), и у вас будет несколько таймеров, запускающих событие Elapsed. –

+0

Я попытался сделать таймер как поле службы, но он поворачивается, чтобы поднять событие Elapsed 3 раза. – Burst

ответ

0

только что установленный var _tm = new System.Timers.Timer(2000); Внешний вид onstart способ ... например, в constuctor. Это должно исправить вашу проблему.

+0

Я попытался сделать '_tm' как поле Сервиса, а затем установить значение в конструкторе, запустить только '_tm.Start() 'в' OnStart() ', к моему удивлению, он запускается три раза, когда истек ... – Burst

+0

if (! _ tm.isEnabled) _tm.Start(); – CodeDemen

+0

ничего не меняется .. – Burst

0

Окончательно решена с использованием интервала блокировки и проверки.

+0

Пожалуйста, покажите нам рабочий код. – samjudson