【发布时间】: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