続・C#(.NET) の System.Timers.Timer クラスのメモ

http://d.hatena.ne.jp/unibon/20080414/p2 の続き。
つぎのようなコードだと、ある1回のタイマーイベントを待たずに、次のタイマーイベントが再入してくる。したがって、あたりまえだが排他制御をちゃんとする必要がある。

        private System.Timers.Timer innerTimer2 = new System.Timers.Timer();

        private int id = 0;

        private void innerTimer2_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            int localId;
            lock (this)
            {
                localId = id++;
            }
            Debug.WriteLine("elapsed enter: " + localId + " " + DateTime.Now.ToString("hh:mm:ss.fff"));
            System.Threading.Thread.Sleep(1000);
            Debug.WriteLine("elapsed leave: " + localId + " " + DateTime.Now.ToString("hh:mm:ss.fff"));
        }

        private void button2_Click(object sender, EventArgs e)
        {
            innerTimer2.Elapsed += new System.Timers.ElapsedEventHandler(innerTimer2_Elapsed);
            innerTimer2.Interval = 500;
            innerTimer2.Start();
        }

出力結果はつぎのとおり。

elapsed enter: 0 11:44:58.647
elapsed enter: 1 11:44:59.131
elapsed enter: 2 11:44:59.631
elapsed leave: 0 11:44:59.693
elapsed enter: 3 11:45:00.131
elapsed leave: 1 11:45:00.147
elapsed enter: 4 11:45:00.631
elapsed leave: 2 11:45:00.631
elapsed enter: 5 11:45:01.131
elapsed leave: 3 11:45:01.131
elapsed enter: 6 11:45:01.631
elapsed leave: 4 11:45:01.631