C# System.Timers.Timer在几毫秒后再次触发
在我的应用程序中,我有一个System.Timers.Timer,它在几毫秒后再次启动 计时器的声明:C# System.Timers.Timer在几毫秒后再次触发,c#,multithreading,timer,C#,Multithreading,Timer,在我的应用程序中,我有一个System.Timers.Timer,它在几毫秒后再次启动 计时器的声明: mRecipeTimer = new System.Timers.Timer(30000); mRecipeTimer.Start(); mRecipeTimer.Elapsed += new ElapsedEventHandler(mRecipeTimer_Elapsed); 计时器消失事件: void mRecipeTimer_Elapsed(object sender, Elapsed
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.
我已准备好放置一个联锁,以便在同一时间只能运行一个操作。但不幸的是,计时器触发其事件两次,我不知道为什么。在处理事件时,您始终可以禁用/启用计时器,即
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
}
void mRecipeTimer_已过(对象发送方,ElapsedEventArgs e)
{
mRecipeTimer.Enabled=false;//您是否尝试过改用System.Threading.Timer
?我更喜欢使用它,而且从来没有遇到过问题。您在哪里启动计时器?您确定没有多个实例浮动?为什么需要联锁?如果计时器每30秒执行一次,是否存在风险在这个时间间隔内,它将调用两次处理程序?您是否注册了两次已运行的事件处理程序?我稍微更改了post,添加了事件耦合和start命令。如您所见,我在添加事件处理程序之前启动计时器。创建和启动是在后台工作程序中完成的。@Bojo:我意识到您编写了您发布的事件处理程序你自己,是你不知道的另一个让我担心:)看看InitializeComponent()
方法。不幸且幸运的是,不是计时器触发了两次。而是包含计时器的对象被实例化了两次。我遇到了类似的问题,并发现我无法重置ElapsedEventHandler