我正在为 Windows 服务项目编码,我使用 System.Timers.Timer 进行一些工作。
我将间隔设置为 2000 毫秒。
但我发现计时器将在前 2000 毫秒内引发 Elapsed 事件 1 次,然后每隔 2000 毫秒引发两次 Elasped 事件。
我认为我的程序有问题,我尝试通过锁定来解决它:
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()
我通过run方法调试windows服务项目Main()
,是这个原因吗?