【问题标题】:System.Timers.Timer.Elapsed event not firing [duplicate]System.Timers.Timer.Elapsed 事件未触发 [重复]
【发布时间】:2015-08-27 14:04:50
【问题描述】:

我在我的窗口窗体应用程序上创建了新的Timer 变量:

intervalTime = new System.Timers.Timer();
intervalTime.Interval = 5000;

intervalTime.Enabled = true;
Console.WriteLine(intervalTime.Enabled.ToString());
intervalTime.Elapsed += new ElapsedEventHandler(intervalTime_Elapsed);
Console.WriteLine(intervalTime.Enabled.ToString());

而我的Timer 将使用ElapsedEvent 每 5 秒执行一次:

void intervalTime_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
      //Do something....
}

但是ElapsedEvent 根本没有开火。我该怎么做才能让它被解雇?我检查intervalTime.Enabledtrue

我之前找到了this question,但它没有解决我的问题

【问题讨论】:

    标签: c# timer


    【解决方案1】:

    您需要在启动计时器之前设置事件处理程序。那是在你打电话之前intervalTime.Enabled = true;

    using System;
    using System.Timers;
    
    namespace ConsoleApplication4
    {
        class Program
        {
            static void Main(string[] args)
            {
                var intervalTime = new System.Timers.Timer();
    
                //Do IT HERE
                intervalTime.Elapsed += new ElapsedEventHandler(intervalTime_Elapsed);
    
                intervalTime.Interval = 5000;
    
                intervalTime.Enabled = true;
                Console.WriteLine(intervalTime.Enabled.ToString());
                Console.WriteLine(intervalTime.Enabled.ToString());
    
                Console.ReadLine();
            }
    
    
            static void intervalTime_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
            {
                //Do something....
                Console.WriteLine("New event fired");
            }
        }
    }
    

    【讨论】:

    • 我使用了你的解决方案,但问题仍然存在,兄弟
    • 我已经测试了那个代码,你能运行我的整个示例并验证吗?也许你没有显示你拥有的所有代码。
    • 我已更新以显示完整示例,因此您可以轻松尝试。
    【解决方案2】:

    您可能想在这里使用System.Windows.Forms.Timer 而不是System.Timers.TimerSystem.Windows.Forms.Timer 有一个 Tick 事件,每 N 毫秒自动触发一次(您可以使用 Interval 属性设置,就像 System.Windows.Forms.Timer 一样)。这与 System.Timers.Timer 不同,后者仅触发一次 Elapsed 事件,并且其行为更像是定时炸弹而不是“预定的股票代码”。

    如果必须使用System.Windows.Forms.Timer,则应将AutoReset 属性设置为True,以使事件重复发生。

    编辑

    似乎他们已经将AutoReset属性的默认值更改为true;这意味着System.Timers.Timer 现在默认重复触发Elapsed 事件,就像System.Windows.Forms.Timer 一样。但是,请注意 Microsoft explicitly recommends using System.Windows.Forms.Timer in WinForms applications,就像我在上面所做的那样。

    【讨论】:

    • 为什么选择 System.Windows.Forms.Timer ?他正在使用控制台应用程序,不需要将计时器与 UI 事件同步。
    • @JuanK:我正在使用窗口窗体应用程序^^
    • 他在问题正文中明确提到他正在使用 Windows 窗体。想收回你的反对票吗?
    • 真实故事。我仍然没有看到任何需要使用 System.Windows.Forms.Timer 来解决您的问题。
    • @dotNET System.Timers.Timer 不会只触发一次 Elapsed 事件...实际上 System.Timers.Timer 会在每次经过的时间间隔发生时触发事件
    【解决方案3】:

    我不确定我们是否必须在定义后启动这个计时器。

    也许我们应该这样做:

    intervalTime.Start();

    【讨论】:

      猜你喜欢
      • 2017-12-27
      • 1970-01-01
      • 2017-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多