我正在编写一个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()
中运行Main()
方法调试Windows服务项目,这是原因吗?
答案 0 :(得分:0)
在onstart方法之外设置var _tm = new System.Timers.Timer(2000);
...例如,在构造函数中。这应该可以解决您的问题
答案 1 :(得分:0)
最后通过使用锁定和检查间隔来解决。