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 不能?