2012-04-07 119 views
0

我正在学习由Daniel M. Solis撰写的Book Illustrated C#2010中的C#事件,并尝试了关于VS 2010中事件的示例。出于某种原因,我收到了两次事件消息,但对于我的生活,我无法弄清楚为什么。下面是代码:为什么此事件发生两次?

using System; 
using System.Text; 
using System.Threading; 

namespace ConsoleApplication3 
{ 
    internal class MyTimerClass 
    { 
     public event EventHandler<MyTCEventArgs> Elapsed; 

     public void OnOneSecond(object source, EventArgs args) 
     { 
      if (Elapsed != null) 
      { 
       MyTCEventArgs mtcea = new MyTCEventArgs("Message from OnOneSecond"); 
       Elapsed(source, mtcea); 
      } 
     } 

     //----------------- 
     private System.Timers.Timer MyPrivateTimer; 

     public MyTimerClass() 
     { 
      MyPrivateTimer = new System.Timers.Timer(); 

      MyPrivateTimer.Elapsed += OnOneSecond; 

      MyPrivateTimer.Interval = 1000; 

      MyPrivateTimer.Enabled = true; 
     } 
    } 

    internal class ClassA 
    { 
     public void TimerHandlerA(object source, MyTCEventArgs args) 
     { 
      Console.WriteLine("Class A Message: {0}", args.Message); 
     } 
    } 

    internal class ClassB 
    { 
     public static void TimerHandlerB(object source, MyTCEventArgs args) 
     { 
      Console.WriteLine("Class B Message: {0}", args.Message); 
     } 
    } 

    internal class MyTCEventArgs : EventArgs 
    { 
     public string Message; 

     public MyTCEventArgs(string s) 
     { 
      Message = s; 
     } 
    } 

    internal class Program 
    { 
     private static void Main(string[] args) 
     { 
      ClassA ca = new ClassA(); 
      MyTimerClass mc = new MyTimerClass(); 

      mc.Elapsed += new EventHandler<MyTCEventArgs>(ca.TimerHandlerA); 
      mc.Elapsed += new EventHandler<MyTCEventArgs>(ClassB.TimerHandlerB); 

      Thread.Sleep(2250); 
     } 
    } 
} 

结果是以下消息: A类消息:从乙OnOneSecond 类消息的消息:从OnOneSecond A类消息的消息:从乙OnOneSecond 类消息消息:消息从OnOneSecond

为什么会发生两次?另外还有一点,当我删除Thread.Sleep行时,什么也没有发生。这也让我感到困惑。

回答

4

你的计时器正在另一个线程上运行,所以它不会被Sleep()的调用阻塞。它有一个间隔1000,你睡觉2250。因此,Tick事件将在那段时间内提升两次,这就是你所看到的。

如果您删除睡眠,完全没有任何事情发生的原因是因为您的程序在Tick事件被触发之前退出。请记住,该事件每1000毫秒提高,并且它比程序退出的时间少得多。

+0

这很有道理。谢谢。我甚至没有想到我的事件需要1秒才能真正被提出。 – JeramyRR 2012-04-07 01:42:59

相关问题