0

我正在为 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(),是这个原因吗?

4

2 回答 2

0

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

于 2013-02-23T10:01:21.663 回答
0

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

于 2013-02-22T11:01:20.670 回答