知識マップ: .NETタイマー3種の使い分け - PeriodicTimer/Timer/DispatcherTimer

記事「.NETタイマー3種の使い分け - PeriodicTimer/Timer/DispatcherTimer」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。

この記事は.NETの3種類のタイマーを、実行される場所と処理の書き方で整理します。PeriodicTimerはCancellationTokenを使いawaitでtickを待つ型のタイマーで、worker/BackgroundServiceでの非同期の定期処理に向きますが、高精度な周期実行の道具ではありません。System.Threading.TimerはThreadPool上でcallbackが呼ばれる軽量なタイマーで、前回のcallback完了を待たないため重なりが起こり得るうえ、voidであるTimerCallbackにasyncラムダを渡すとasync void相当の扱いになり、ThreadPool上の未処理例外がプロセスを落としかねません。DispatcherTimerはWPFのDispatcher上でTickが処理されるためUIを直接更新できますが、重い処理はUIスレッドの詰まりを招き、Stop()や購読解除を怠るとオブジェクトの寿命を引っ張ることがあります。WinForms用のTimerも精度が55ミリ秒程度に限られる点は共通です。

PeriodicTimer・System.Threading.Timer・DispatcherTimerの使い分けの知識マップPeriodicTimerがCancellationTokenを使いBackgroundServiceでの非同期の定期処理に向くこと、System.Threading.TimerがThreadPool上でcallbackの重なりやasync void相当の落とし穴を持つこと、DispatcherTimerがWPFのDispatcher上でUIスレッドの詰まりや購読解除漏れのリスクと引き換えにUI更新を担うこと、いずれも高精度な周期実行の要件には向かないことを示す図利用する推奨される対応推奨される対応用いるのは非推奨利用する原因になり得る原因になり得る用いるのは非推奨用いるのは非推奨原因になり得る利用する原因になり得る用いるのは非推奨原因になり得る用いるのは非推奨推奨される対応前提とする利用するPeriodicTimerSystem.Threading.TimerDispatcherTimerCancellationToken(.NET)BackgroundService非同期の定期処理高精度な周期実行の要件.NETスレッドプールタイマーcallbackの重なりasync void相当のコールバックThreadPool上の未処理例外によるプロセス終了DispatcherPriorityUIスレッドの詰まりイベント購読解除漏れSystem.Windows.Forms.Timer再入防止ガード(Interlocked.Exchange等)Dispatcher(WPF)

概念間の関係(全18件)

図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。

主要概念の定義

PeriodicTimer
WaitForNextTickAsyncをawaitして使う、一定間隔の非同期処理向けのタイマー型。1つのタイマーに対して同時に複数のWaitForNextTickAsyncを飛ばさない前提で使う。
System.Threading.Timer
指定した間隔ごとにThreadPool上でcallbackを呼び出す軽量な.NETのタイマークラス。前回のcallback完了を待たない。
DispatcherTimer
WPF/WinUIのDispatcherキューに統合され、TickをUIスレッド上で処理するタイマークラス。
async void相当のコールバック
戻り値がvoidのデリゲート型にasyncラムダ・メソッドを渡すことで生じる、呼び出し元がTaskを持てず完了も例外も追跡できない扱いになるパターン。
System.Windows.Forms.Timer
メッセージループ経由でTickが起きるWindows Formsのシングルスレッドタイマー。精度は55ミリ秒程度が限界とされる。
再入防止ガード(Interlocked.Exchange等)
Interlocked.Exchangeなどの原子的操作でフラグを立て、同じ処理が並行して重複実行されるのを防ぐ実装パターン。
Dispatcher(WPF)
WPFのUIスレッド上で処理を順番に実行するためのメッセージキューを管理するクラス。DispatcherTimerのTickもこのキューに積まれる。

機械可読データ

このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。