.net3.5 System.Timers.Timer.Elapsed两次

时间:2013-02-22 10:44:17

标签: c# .net timer windows-services

我正在编写一个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服务项目,这是原因吗?

2 个答案:

答案 0 :(得分:0)

在onstart方法之外设置var _tm = new System.Timers.Timer(2000); ...例如,在构造函数中。这应该可以解决您的问题

答案 1 :(得分:0)

最后通过使用锁定和检查间隔来解决。