読者です 読者をやめる 読者になる 読者になる

しばやん雑記

ASP.NET とメイドさんが大好きなフリーランスのプログラマーのブログ

.NET Framework に用意された 3 種類の Timer

C#

.NET Framework には 3 種類のタイマークラスが用意されています。

  • System.Timers.Timer
  • System.Threading.Timer
  • System.Windows.Forms.Timer

それぞれ実装方法の違いで挙動が変わっているので、簡単に調べたものをメモしておきます。

System.Timers.Timer クラス

Timer クラス (System.Timers)

System.Timers.Timer はサーバベース・タイマーという、ちょっと精度のいいやつらしいです。しかし UI スレッドとは別のスレッドから呼び出されるので、UI を弄るような時は注意しましょう。

System.Threading.Timer クラス

Timer クラス (System.Threading)

System.Threading.Timer は .NET Framework が用意している ThreadPool を使って実行されるタイマーです。これも System.Timers.Timer と同じく UI スレッドと別のスレッドから呼び出されるので注意が必要です。

System.Windows.Forms.Timer クラス

Timer クラス (System.Windows.Forms)

System.Windows.Forms.Timer は Win32 API が提供している WM_TIMER を使ってるようなので精度についてはあまり期待しないほうがいいです。メッセージキューに精度が左右されます。

DispatcherTimer について

WPF では専用の DispatcherTimer というクラスが用意されています。Dispatcher という WPF で追加されたスレッド周りの処理を行う要素が追加されました。

基本的に Timer は非同期で処理を行うので、WPF アプリケーションではこっちを使ったほうが UI スレッドとのやり取りが便利です。