C# Timer.Elapsed 事件连续触发两次

Posted

技术标签:

【中文标题】C# Timer.Elapsed 事件连续触发两次【英文标题】:C# Timer.Elapsed Event firing twice consecutively 【发布时间】:2017-06-18 18:12:07 【问题描述】:

作为系统“自检”应用程序的一部分,我有一个应用程序每 60 秒调用一次 DLL 中的静态方法。当我手动运行这些方法时,它们都在不到 10 秒的时间内完成。我的问题是 timer.elapsed 事件触发了两次,一个接一个。除此之外,每经过一次计时器,事件就会再触发一次。 (例如,第一次是 2 次触发,第二次是 3 次,第三次是 4 次,等等。)我尝试设置 timer.AutoReset = false 以及在经过的事件开始时设置 timer.Enabled = false,然后将其设置为 true在活动结束时。我试过重置事件的间隔。我发现的每个帖子都表明上述操作应该已经解决了这个问题。谁能帮我找到我缺少的东西?

static Timer cycle = new Timer();
static int cycCount = 0;
static void Main(string[] args)

    Console.WriteLine("Firebird Survivor Auto Cycle Started.");

    Console.CancelKeyPress += Console_CancelKeyPress;

    cycle.Interval = 60000; //set interval for service checks.
    cycle.Elapsed += new ElapsedEventHandler(CycleComplete_Elapsed);
    cycle.AutoReset = false;
    cycle.Enabled = true;

    cycle.Elapsed += CycleComplete_Elapsed; 

    while (1 == 1) //stop main method from completing indefinitely
    
        //WAIT FOR TIMER TO ELAPSE
    



private static void Console_CancelKeyPress(object sender, ConsoleCancelEventArgs e)

    cycle = null;


static void CycleComplete_Elapsed(object sender, ElapsedEventArgs e) //method triggered by timer

    cycle.Enabled = false;

    cycCount++;

    WormholeServiceControls.CheckWormHoleStatus();
    TimeControls.CheckTimePl(); //call time check
    PegasusServiceControls.CheckPegasusStatus(null);

    Console.Clear();
    Console.WriteLine("--------------------------");
    Console.WriteLine(String.Format("| Successful Cycles: 0 |", cycCount));
    Console.WriteLine("--------------------------");

    cycle.Enabled = true;

【问题讨论】:

您添加了两次事件。 感谢@LarsTech。我一直盯着这个,从来没有看到过。 【参考方案1】:

您的问题似乎来自您正在执行的事件处理。您多次分配Elapsed 事件:

cycle.Elapsed += new ElapsedEventHandler(CycleComplete_Elapsed);
cycle.Elapsed += CycleComplete_Elapsed; 

为什么是这两行?只需要这个就可以了:

cycle.Elapsed += new ElapsedEventHandler(CycleComplete_Elapsed);

【讨论】:

现在我觉得非常荒谬。谢谢@nicoriff。

以上是关于C# Timer.Elapsed 事件连续触发两次的主要内容,如果未能解决你的问题,请参考以下文章

在C#中Elapsed是什麽意思?

Windows服务中的Timer Elapsed事件一一

c# Timer异常停止

C# 通过 timer.Elapsed 和单击调用方法

C# winform中timer函数如何停止,点运行后可再次启动周期事件

无法连续两次从列表框中选择相同的项目 - windows phone 8 C#