知識マップ: .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ミリ秒程度に限られる点は共通です。
flowchart LR
accTitle: PeriodicTimer・System.Threading.Timer・DispatcherTimerの使い分けの知識マップ
accDescr: PeriodicTimerがCancellationTokenを使いBackgroundServiceでの非同期の定期処理に向くこと、System.Threading.TimerがThreadPool上でcallbackの重なりやasync void相当の落とし穴を持つこと、DispatcherTimerがWPFのDispatcher上でUIスレッドの詰まりや購読解除漏れのリスクと引き換えにUI更新を担うこと、いずれも高精度な周期実行の要件には向かないことを示す図
periodictimer["PeriodicTimer"]
system_threading_timer["System.Threading.Timer"]
dispatcher_timer["DispatcherTimer"]
cancellationtoken_dotnet["CancellationToken(.NET)"]
backgroundservice["BackgroundService"]
async_periodic_processing["非同期の定期処理"]
precise_periodic_timing["高精度な周期実行の要件"]
dotnet_threadpool[".NETスレッドプール"]
timer_callback_overlap["タイマーcallbackの重なり"]
async_void_callback["async void相当のコールバック"]
unhandled_threadpool_exception["ThreadPool上の未処理例外によるプロセス終了"]
dispatcher_priority["DispatcherPriority"]
ui_thread_blocking["UIスレッドの詰まり"]
event_subscription_leak["イベント購読解除漏れ"]
winforms_timer["System.Windows.Forms.Timer"]
reentrancy_guard["再入防止ガード(Interlocked.Exchange等)"]
wpf_dispatcher["Dispatcher(WPF)"]
periodictimer -->|"利用する"| cancellationtoken_dotnet
periodictimer -->|"推奨される対応"| backgroundservice
periodictimer -->|"推奨される対応"| async_periodic_processing
periodictimer -.->|"用いるのは非推奨"| precise_periodic_timing
system_threading_timer -->|"利用する"| dotnet_threadpool
system_threading_timer -.->|"原因になり得る"| timer_callback_overlap
system_threading_timer -.->|"原因になり得る"| async_void_callback
system_threading_timer -.->|"用いるのは非推奨"| precise_periodic_timing
async_void_callback -->|"用いるのは非推奨"| async_periodic_processing
async_void_callback -.->|"原因になり得る"| unhandled_threadpool_exception
dispatcher_timer -->|"利用する"| dispatcher_priority
dispatcher_timer -.->|"原因になり得る"| ui_thread_blocking
dispatcher_timer -.->|"用いるのは非推奨"| precise_periodic_timing
dispatcher_timer -.->|"原因になり得る"| event_subscription_leak
winforms_timer -->|"用いるのは非推奨"| precise_periodic_timing
reentrancy_guard -->|"推奨される対応"| timer_callback_overlap
dispatcher_timer -->|"前提とする"| wpf_dispatcher
wpf_dispatcher -->|"利用する"| dispatcher_priority
概念間の関係(全18件)
図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。
- PeriodicTimerはCancellationToken(.NET)を利用します。
- PeriodicTimerはBackgroundServiceに対する本記事の推奨です。
- PeriodicTimerは非同期の定期処理に対する本記事の推奨です。
- PeriodicTimerを高精度な周期実行の要件に用いることは推奨されません。
- System.Threading.Timerは.NETスレッドプールを利用します。
- System.Threading.Timerはタイマーcallbackの重なりの原因になることがあります。
- System.Threading.Timerはasync void相当のコールバックの原因になることがあります。
- System.Threading.Timerを高精度な周期実行の要件に用いることは推奨されません。
- async void相当のコールバックを非同期の定期処理に用いることは推奨されません。
- async void相当のコールバックはThreadPool上の未処理例外によるプロセス終了の原因になることがあります。
- DispatcherTimerはDispatcherPriorityを利用します。
- DispatcherTimerはUIスレッドの詰まりの原因になることがあります。
- DispatcherTimerを高精度な周期実行の要件に用いることは推奨されません。
- DispatcherTimerはイベント購読解除漏れの原因になることがあります。
- System.Windows.Forms.Timerを高精度な周期実行の要件に用いることは推奨されません。
- 再入防止ガード(Interlocked.Exchange等)はタイマーcallbackの重なりに対する本記事の推奨です。
- DispatcherTimerはDispatcher(WPF)を前提とします。
- Dispatcher(WPF)はDispatcherPriorityを利用します。
主要概念の定義
機械可読データ
このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。