2012-04-07 118 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

相關問題