C# 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

在我的应用程序中,我有一个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.

我已准备好放置一个联锁,以便在同一时间只能运行一个操作。但不幸的是,计时器触发其事件两次,我不知道为什么。

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

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