System.Timers.Timer 几毫秒后第二次触发

Posted

技术标签:

【中文标题】System.Timers.Timer 几毫秒后第二次触发【英文标题】:System.Timers.Timer fires second time a few milliseconds later 【发布时间】:2012-02-23 09:08:05 【问题描述】:

在我的应用程序中,我有一个 System.Timers.Timer,它会在几毫秒后再次触发。

定时器声明:

mRecipeTimer = new System.Timers.Timer(30000);
mRecipeTimer.Start();
mRecipeTimer.Elapsed += new ElapsedEventHandler(mRecipeTimer_Elapsed);

定时器超时事件:

void mRecipeTimer_Elapsed(object sender, ElapsedEventArgs e)

    int sync = Interlocked.CompareExchange(ref syncPoint, 1, 0);
    if (sync == 0)
    
        Thread.CurrentThread.Name = string.Format("timer, started at 0 (1)", DateTime.Now, DateTime.Now.Millisecond);
        Log.Info("Recipe timer elapsed.");
        // some code
        syncPoint = 0;
    

这就是我在日志中看到的:

2012-01-31 11:17:26,797 [timer, started at 1/31/2012 11:17:26 AM (797)] INFO  - Recipe timer elapsed.
2012-01-31 11:17:27,875 [timer, started at 1/31/2012 11:17:27 AM (875)] INFO  - Recipe timer elapsed.
2012-01-31 11:17:56,797 [timer, started at 1/31/2012 11:17:56 AM (797)] INFO  - Recipe timer elapsed.
2012-01-31 11:17:57,875 [timer, started at 1/31/2012 11:17:57 AM (875)] INFO  - Recipe timer elapsed.

我已经设置了一个联锁,以便只能同时运行一个动作。但不幸的是,计时器触发了它的事件两次,我不知道为什么。

【问题讨论】:

您是否尝试过改用System.Threading.Timer?我更喜欢使用那个,而且从来没有遇到过问题。 你在哪里开始计时?你确定你没有多个实例浮动吗?为什么需要联锁?如果计时器每 30 秒执行一次,是否存在在此间隔内调用两次处理程序的风险? 您是否注册了两次 Elapsed 事件处理程序? 我对帖子做了一点改动,我添加了事件耦合和启动命令。如您所见,我在添加事件处理程序之前启动了计时器。创建和启动是在后台工作人员中完成的。 @Bojo:我知道你写了你自己发布的那个,另一个你不知道的让我担心:) 查看 .Designer.cs 文件中的InitializeComponent() 方法。 【参考方案1】:

您始终可以在处理事件时禁用/启用计时器,即,

void mRecipeTimer_Elapsed(object sender, ElapsedEventArgs e)

    mRecipeTimer.Enabled = false; //<---- disable

    int sync = Interlocked.CompareExchange(ref syncPoint, 1, 0);
    if (sync == 0)
    
        Thread.CurrentThread.Name = string.Format("timer, started at 0 (1)", DateTime.Now, DateTime.Now.Millisecond);
        Log.Info("Recipe timer elapsed.");
        // some code
        syncPoint = 0;
    

    mRecipeTimer.Enabled = true; //<---- enable

【讨论】:

不幸和幸运的是,计时器没有触发两次。就是包含计时器的对象被实例化了两次。 遇到了类似的问题,发现无法重置ElapsedEventHandler

以上是关于System.Timers.Timer 几毫秒后第二次触发的主要内容,如果未能解决你的问题,请参考以下文章

System.Timers.Timer 每秒最多只能提供 64 帧

System.Timers.Timer 与 System.Threading.Timer

为啥 System.Timers.Timer 能在 GC 中存活,而 System.Threading.Timer 不能?

System.Timers.Timer 严重不准确

使用System.Timers.Timer类实现程序定时执行

c# 怎么设置 System.Timers.Timer执行次数 t5.AutoReset = false;