none
System.Timers.Timer 把Enabled设置成false之后,为什么还会触发Elapsed事件 RRS feed

  • 问题

  •     class Program
        {
            Timer timer = null;

            static void Main(string[] args)
            {
                Program p = new Program();
                p.init();
                Console.Read();

            }
            public void init()
            {
                this.timer = new Timer(10000);
                this.timer.Enabled = false;
                this.timer.AutoReset = false;
                this.timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
                this.timer.Start();
            }

            void timer_Elapsed(object sender, ElapsedEventArgs e)
            {
                Console.WriteLine(DateTime.Now.ToString());
            }
        }
    代码如上 ,10秒之后,就会写出当前时间,为什么会这样呢
    2010年5月29日 13:57

答案

  • 你好!

          注意我在最后一行注释中的解释:

            public void init()
            {
                this.timer = new Timer(10000);
                this.timer.Enabled = false;
                this.timer.AutoReset = false;
                this.timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
                this.timer.Start();  //这个方法重新启动了timer,Enabled有再次设置为 true;
            }

    周雪峰
    2010年5月30日 0:18
    版主

全部回复

  • 因为 this.timer.Start() 了,它又把 Enable 设置为 true了。

    Start 通过将 Enabled 设置为 true 开始引发 Elapsed 事件。

    2010年5月29日 14:21
  • 你好!

          注意我在最后一行注释中的解释:

            public void init()
            {
                this.timer = new Timer(10000);
                this.timer.Enabled = false;
                this.timer.AutoReset = false;
                this.timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
                this.timer.Start();  //这个方法重新启动了timer,Enabled有再次设置为 true;
            }

    周雪峰
    2010年5月30日 0:18
    版主
  • 谢谢版主,这么说this.timer.Enabled = false;这个语句只有在timer 已经运行时设置才有作用?
    2010年5月30日 2:54
  • 你好!     Timer还没有开始的时候,这个属性本身就是false的!
    周雪峰
    2010年5月30日 4:20
    版主