System.Windows.Forms.TimerではなくSystem.Timers.Timerを参照していると思います。ドキュメントが言うように:
サーバーベースのタイマーは、マルチスレッド環境でワーカー スレッドを使用するように設計されています。サーバー タイマーは、発生した Elapsed イベントを処理するためにスレッド間を移動できるため、Windows タイマーよりも正確にイベントを時間通りに発生させることができます。
Elapsed
2 つの異なるスレッドが2 つの異なるタイマーのイベントを発生させないという保証はありません。コードをスレッドセーフにすることをお勧めします。
Elapsed
の複数のコールバックを同時に呼び出すことができることを示す短いコード スニペットを追加しています(この場合、デッドロックが発生しDebug.WriteLine
ます。呼び出されることはありません)。
var _lock = new object();
GC.KeepAlive(_lock);
var timer1 = new Timer(100);
var timer2 = new Timer(200);
timer1.Elapsed += delegate
{
lock (_lock)
Thread.Sleep(-1);
};
timer2.Elapsed += delegate
{
lock (_lock)
Debug.WriteLine("Hello world.");
};
timer1.Start();
timer2.Start();