2012-04-07 10 views
0

私はダニエル・M.ソリスによってブックイラストのC#2010でのC#のイベントについて学んだし、私は二回のイベントメッセージを取得するいくつかの理由が、私の人生のためにVS 2010でのイベントについて与えられた例をしようとしています理由を理解できません。ここでは、コードは次のとおりこのイベントはなぜ2回起こりますか?

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

結果は次のメッセージである。 クラスメッセージ:OnOneSecond クラスBメッセージからのメッセージ:OnOneSecond クラスからのメッセージのメッセージ:OnOneSecond クラスBメッセージからのメッセージ:メッセージ

OnOneSecondなぜそれが二度起こるのでしょうか?それと別に、Thread.Sleep行を削除すると、何も起こりません。これも私を混乱させる。

答えて

4

それはSleep()への呼び出しによってブロックされていないので、あなたのタイマーは、別のスレッドで実行されています。間隔は1000で、睡眠時間は2250です。従って、Tickイベントは、その期間に2回提起されます。これはあなたが見ているものです。 Tickイベントが発生する前に、あなたのプログラムが終了したために

あなたは睡眠を削除する場合は何もまったく起こらないという理由があります。このイベントは、すべて1000 msに発生し、プログラムを終了するのにかかる時間がはるかに短いことを忘れないでください。完璧な理にかなって

+0

。ありがとうございました。私は実際に起こるために1秒かかる私の出来事について考えることさえしなかった。 – JeramyRR

関連する問題