【问题标题】:System.Timers.Timer fires second time a few milliseconds laterSystem.Timers.Timer 几毫秒后第二次触发
【发布时间】: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() 方法。

标签: c# multithreading timer


【解决方案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
猜你喜欢
  • 1970-01-01
  • 2012-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-10
  • 2013-08-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多