System.Threading.Timer.NETにはTimerクラスが3つあって、WinForm用のはどうもいまいち様子がわからない。System.Timers.Timerについては、石塚さんが言及されている。最後のSystem.Threading.Timerは、matarilloさんによればGCされてしまうとMSDNに明記されているとのことだ。使用している間は、このクラスへの参照を保持しておく必要があります。コレクションの対象となります。コレクションの対象から除外されることはありません。いうわけでおもしろそうなのでSystem.Threading.Timerを試した。System.Threading.Timeout.Infinite);期待通りにメッセージボックスは表示されない。timer2を10秒以上に取れば、2回目以降、20秒以上に取れば3回目以降は表示されなくなる。いうことは、System.Threading。Timerは、上記のような使い方、つまり自動変数として定義して放り投げるのは、だめだということだ(が、後始末は不要なので、便利は便利。言え、イベントを出さずに消えてなくなるのはいやだな)。WindowsFormで利用する場合は、スレッド間マーシャリングを考えなくても良いので、Timerをインスタンス変数に持って使うのが良いだろう(というか、保持しておかなければDisposeできない。アプリケーションと同じ寿命を持つことが前提ならば後始末を考えなくても良いので自動変数のほうが余分なインスタンス変数名を定義する必要がないので良いかも。