2012-04-07 8 views
0

Ich lerne über C# -Ereignisse in der Buch Illustrierten C# 2010 von Daniel M. Solis und probiere das Beispiel über Ereignisse in VS 2010 aus. Aus irgendeinem Grund bekomme ich die Ereignisnachricht zweimal, aber für das Leben von mir kann nicht herausfinden, warum. Hier ist der Code:Warum passiert dieses Ereignis zweimal?

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); 
     } 
    } 
} 

Das Ergebnis ist die folgende Meldung: Klasse A Nachricht: Nachricht von OnOneSecond Klasse B Nachricht: Nachricht von OnOneSecond Klasse A Nachricht: Nachricht von OnOneSecond Klasse B Nachricht: Nachricht von OnOneSecond

Warum passiert es zweimal? Auch davon getrennt, wenn ich die Thread.Sleep-Zeile entferne passiert überhaupt nichts. Das verwirrt mich auch.

Antwort

4

Ihr Timer läuft auf einem anderen Thread, so dass er nicht durch den Anruf auf Sleep() blockiert wird. Es hat ein Intervall von 1000 und Sie schlafen für 2250. Daher wird das Ereignis Tick in diesem Zeitraum zweimal ausgelöst, was Sie sehen.

Der Grund, dass nichts passiert, wenn Sie den Schlaf entfernen, ist, weil Ihr Programm beendet wird, bevor ein Tick Ereignis ausgelöst wird. Denken Sie daran, dass dieses Ereignis alle 1000 ms ausgelöst wird und es viel weniger Zeit als für das Programm benötigt, um zu beenden.

+0

Das macht Sinn. Vielen Dank. Ich habe nicht einmal daran gedacht, dass mein Event eine Sekunde dauert, um tatsächlich aufgezogen zu werden. – JeramyRR

Verwandte Themen