Я кодирую проект службы 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()
, это причина?
Код выглядит сломанным, когда таймер является локальной переменной. Это означает, что вы никогда не сможете остановить таймер, чтобы вы не могли правильно реализовать OnStop(). Начните более одного раза, что вы делаете, также называя его от Main(), и у вас будет несколько таймеров, запускающих событие Elapsed. –
Я попытался сделать таймер как поле службы, но он поворачивается, чтобы поднять событие Elapsed 3 раза. – Burst