続・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