0

DanielM.SolisによるBookIllustratedC#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);
        }
    }
}

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

なぜそれが2回起こるのですか?また、それとは別に、Thread.Sleep行を削除しても何も起こりません。これも私を混乱させます。

4

1 に答える 1

4

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

スリープを解除しても何も起こらないのは、Tickイベントが発生する前にプログラムが終了するためです。そのイベントはミリ秒ごとに発生1000し、プログラムが終了するよりもはるかに短い時間で済むことを忘れないでください。

于 2012-04-07T01:39:38.700 に答える