@prefix schema: <https://schema.org/> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix ks: <https://comcomponent.com/vocab/> .

<https://comcomponent.com/blog/2026/03/12/002-periodictimer-system-threading-timer-dispatchertimer-guide/#article>
    schema:about <https://comcomponent.com/knowledge/periodictimer/>, <https://comcomponent.com/knowledge/system-threading-timer/>, <https://comcomponent.com/knowledge/dispatcher-timer/> ;
    schema:mentions <https://comcomponent.com/knowledge/winforms-timer/>, <https://comcomponent.com/knowledge/dispatcher-priority/>, <https://comcomponent.com/knowledge/timer-callback-overlap/>, <https://comcomponent.com/knowledge/async-void-callback/>, <https://comcomponent.com/knowledge/unhandled-threadpool-exception/>, <https://comcomponent.com/knowledge/backgroundservice/>, <https://comcomponent.com/knowledge/ui-thread-blocking/>, <https://comcomponent.com/knowledge/precise-periodic-timing/>, <https://comcomponent.com/knowledge/event-subscription-leak/>, <https://comcomponent.com/knowledge/reentrancy-guard/>, <https://comcomponent.com/knowledge/wpf-dispatcher/>, <https://comcomponent.com/knowledge/async-periodic-processing/>, <https://comcomponent.com/knowledge/cancellationtoken-dotnet/>, <https://comcomponent.com/knowledge/dotnet-threadpool/> .

<https://comcomponent.com/knowledge/periodictimer/> a skos:Concept ;
    skos:prefLabel "PeriodicTimer"@ja ;
    skos:definition "WaitForNextTickAsyncをawaitして使う、一定間隔の非同期処理向けのタイマー型。1つのタイマーに対して同時に複数のWaitForNextTickAsyncを飛ばさない前提で使う。"@ja ;
    skos:altLabel "System.Threading.PeriodicTimer" ;
    ks:uses <https://comcomponent.com/knowledge/cancellationtoken-dotnet/> ;
    ks:recommendedFor <https://comcomponent.com/knowledge/backgroundservice/> ;
    ks:recommendedFor <https://comcomponent.com/knowledge/async-periodic-processing/> .

<https://comcomponent.com/knowledge/system-threading-timer/> a skos:Concept ;
    skos:prefLabel "System.Threading.Timer"@ja ;
    skos:definition "指定した間隔ごとにThreadPool上でcallbackを呼び出す軽量な.NETのタイマークラス。前回のcallback完了を待たない。"@ja ;
    skos:altLabel "Timer (System.Threading)" ;
    ks:uses <https://comcomponent.com/knowledge/dotnet-threadpool/> .

<https://comcomponent.com/knowledge/dispatcher-timer/> a skos:Concept ;
    skos:prefLabel "DispatcherTimer"@ja ;
    skos:definition "WPF/WinUIのDispatcherキューに統合され、TickをUIスレッド上で処理するタイマークラス。"@ja ;
    skos:altLabel "System.Windows.Threading.DispatcherTimer" ;
    ks:uses <https://comcomponent.com/knowledge/dispatcher-priority/> ;
    ks:requires <https://comcomponent.com/knowledge/wpf-dispatcher/> .

<https://comcomponent.com/knowledge/cancellationtoken-dotnet/> a skos:Concept ;
    skos:prefLabel "CancellationToken(.NET)"@ja ;
    skos:definition ".NETの協調的キャンセルの仕組み。非同期モードのハンドルへのファイルI/Oでは、内部的にCancelIoExの呼び出しに行き着く。"@ja ;
    skos:altLabel "CancellationToken" .

<https://comcomponent.com/knowledge/backgroundservice/> a skos:Concept ;
    skos:prefLabel "BackgroundService"@ja ;
    skos:definition "IHostedServiceの書きやすい実装補助となる抽象クラスで、長く走る本体をExecuteAsyncに書ける。"@ja ;
    skos:altLabel "BackgroundService クラス"@ja .

<https://comcomponent.com/knowledge/async-periodic-processing/> a skos:Concept ;
    skos:prefLabel "非同期の定期処理"@ja ;
    skos:definition "HTTP呼び出し・DB問い合わせ・ファイル読み込みなどI/O待ちを伴う処理を、一定間隔でasync/awaitの流れとして実行したいという要件。"@ja ;
    skos:altLabel "async periodic processing" .

<https://comcomponent.com/knowledge/precise-periodic-timing/> a skos:Concept ;
    skos:prefLabel "高精度な周期実行の要件"@ja ;
    skos:definition "1ミリ秒〜数ミリ秒級で周期の揺れやdeadline missをできるだけ減らしたいという、アプリの定期実行とは別種の要件。"@ja ;
    skos:altLabel "周期精度"@ja ;
    skos:altLabel "deadlineに近い周期実行"@ja .

<https://comcomponent.com/knowledge/dotnet-threadpool/> a skos:Concept ;
    skos:prefLabel ".NETスレッドプール"@ja ;
    skos:definition ".NETランタイムが提供する、ワーカースレッドとI/O完了スレッドの2階建てのスレッドプール。非同期I/Oのハンドルは内部で自前のI/O完了ポートに結び付けられる。"@ja ;
    skos:altLabel "managed thread pool" .

<https://comcomponent.com/knowledge/timer-callback-overlap/> a skos:Concept ;
    skos:prefLabel "タイマーcallbackの重なり"@ja ;
    skos:definition "周期より処理時間が長い場合に、前回のcallbackが完了する前に次のcallbackが起動され、複数のcallbackが同時に実行される状態。"@ja ;
    skos:altLabel "callback overlap" .

<https://comcomponent.com/knowledge/async-void-callback/> a skos:Concept ;
    skos:prefLabel "async void相当のコールバック"@ja ;
    skos:definition "戻り値がvoidのデリゲート型にasyncラムダ・メソッドを渡すことで生じる、呼び出し元がTaskを持てず完了も例外も追跡できない扱いになるパターン。"@ja ;
    skos:altLabel "async void" ;
    skos:altLabel "TimerCallbackへのasyncラムダ"@ja ;
    ks:notRecommendedFor <https://comcomponent.com/knowledge/async-periodic-processing/> .

<https://comcomponent.com/knowledge/unhandled-threadpool-exception/> a skos:Concept ;
    skos:prefLabel "ThreadPool上の未処理例外によるプロセス終了"@ja ;
    skos:definition "SynchronizationContextを持たないThreadPoolのスレッド上で例外がcatchされずに伝播し、既定でプロセス全体を終了させる状態。"@ja ;
    skos:altLabel "unhandled exception on ThreadPool" .

<https://comcomponent.com/knowledge/dispatcher-priority/> a skos:Concept ;
    skos:prefLabel "DispatcherPriority"@ja ;
    skos:definition "WPFのDispatcherキュー上で処理を実行する優先度を表す列挙型。値が大きいほど優先度が高い。"@ja ;
    skos:altLabel "ディスパッチャー優先度"@ja .

<https://comcomponent.com/knowledge/ui-thread-blocking/> a skos:Concept ;
    skos:prefLabel "UIスレッドの詰まり"@ja ;
    skos:definition "UIスレッド上で重い処理やブロッキングI/Oが実行され、入力処理や画面描画が遅延・停止する状態。"@ja ;
    skos:altLabel "UI応答性の低下"@ja ;
    skos:altLabel "UIブロッキング"@ja .

<https://comcomponent.com/knowledge/event-subscription-leak/> a skos:Concept ;
    skos:prefLabel "イベント購読解除漏れ"@ja ;
    skos:definition "寿命の長いpublisherが寿命の短いsubscriberをイベントハンドラー経由で参照し続け、購読解除しない限りsubscriberが解放されないリークパターン。"@ja .

<https://comcomponent.com/knowledge/winforms-timer/> a skos:Concept ;
    skos:prefLabel "System.Windows.Forms.Timer"@ja ;
    skos:definition "メッセージループ経由でTickが起きるWindows Formsのシングルスレッドタイマー。精度は55ミリ秒程度が限界とされる。"@ja ;
    skos:altLabel "WinForms Timer" ;
    ks:notRecommendedFor <https://comcomponent.com/knowledge/precise-periodic-timing/> .

<https://comcomponent.com/knowledge/reentrancy-guard/> a skos:Concept ;
    skos:prefLabel "再入防止ガード(Interlocked.Exchange等)"@ja ;
    skos:definition "Interlocked.Exchangeなどの原子的操作でフラグを立て、同じ処理が並行して重複実行されるのを防ぐ実装パターン。"@ja ;
    skos:altLabel "reentrancy guard" ;
    skos:altLabel "多重実行防止"@ja ;
    ks:recommendedFor <https://comcomponent.com/knowledge/timer-callback-overlap/> .

<https://comcomponent.com/knowledge/wpf-dispatcher/> a skos:Concept ;
    skos:prefLabel "Dispatcher(WPF)"@ja ;
    skos:definition "WPFのUIスレッド上で処理を順番に実行するためのメッセージキューを管理するクラス。DispatcherTimerのTickもこのキューに積まれる。"@ja ;
    skos:altLabel "System.Windows.Threading.Dispatcher" ;
    skos:altLabel "UIスレッドのメッセージキュー"@ja ;
    ks:uses <https://comcomponent.com/knowledge/dispatcher-priority/> .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/periodictimer/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/cancellationtoken-dotnet/> ;
    schema:description "PeriodicTimer.WaitForNextTickAsyncはCancellationTokenを受け取り、キャンセルをそのまま下流の処理へ伝播できる"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.threading.periodictimer.waitfornexttickasync?view=net-10.0> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/periodictimer/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/backgroundservice/> ;
    schema:description "worker/BackgroundServiceでasyncな定期処理を書きたい場合、まずPeriodicTimerが本記事の推奨である"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services?view=aspnetcore-10.0> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/periodictimer/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/async-periodic-processing/> ;
    schema:description "待つ→処理する→また待つを1本のasyncメソッドの流れとして書け、CancellationTokenも下流へ渡しやすいため、非同期の定期処理にはまずPeriodicTimerが推奨される"@ja ;
    ks:evidence <https://learn.microsoft.com/ja-jp/dotnet/api/system.threading.periodictimer?view=net-10.0> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/periodictimer/> ;
    rdf:predicate ks:notRecommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/precise-periodic-timing/> ;
    schema:description "PeriodicTimerの実務での強みはasyncフローの書きやすさであり、1ms〜数ms級の周期精度や揺れの管理を主目的とした道具ではない"@ja ;
    ks:evidence <https://learn.microsoft.com/ja-jp/dotnet/api/system.threading.periodictimer?view=net-10.0> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/system-threading-timer/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/dotnet-threadpool/> ;
    schema:description "System.Threading.TimerのcallbackはThreadPoolで実行され、作成したスレッドでは動かない"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.threading.timer?view=net-10.0> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/system-threading-timer/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/timer-callback-overlap/> ;
    schema:description "前回のcallback完了を待たないため、間隔より処理が長いとcallbackが重なりうる"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.threading.timer?view=net-10.0> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/system-threading-timer/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/async-void-callback/> ;
    schema:description "TimerCallbackはvoidであるため、System.Threading.Timerにasyncラムダをそのまま渡すと実質async void相当の扱いになる"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/archive/msdn-magazine/2013/march/async-await-best-practices-in-asynchronous-programming> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/system-threading-timer/> ;
    rdf:predicate ks:notRecommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/precise-periodic-timing/> ;
    schema:description "System.Threading.Timerは軽量で扱いやすいが、精度のための専用道具ではない"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.threading.timer?view=net-10.0> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/async-void-callback/> ;
    rdf:predicate ks:notRecommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/async-periodic-processing/> ;
    schema:description "async void相当の扱いは呼び出し元がawaitできず完了も例外も追跡できなくなるため、非同期の定期処理の手段としては推奨されない"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/archive/msdn-magazine/2013/march/async-await-best-practices-in-asynchronous-programming> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/async-void-callback/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/unhandled-threadpool-exception/> ;
    schema:description "async void相当のメソッドの例外は開始時点で有効だったSynchronizationContextへ直接投げ返される。ThreadPool上のcallbackにはSynchronizationContextが無いため、callbackの中をtry/catchで自前に包まない限り既定ではプロセスごと落ちる"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/archive/msdn-magazine/2013/march/async-await-best-practices-in-asynchronous-programming> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/dispatcher-timer/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/dispatcher-priority/> ;
    schema:description "DispatcherTimerはコンストラクターでDispatcherPriorityを指定でき、TickをDispatcherキューのどの優先度で処理するかを決める。既定はBackground"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.windows.threading.dispatchertimer.-ctor?view=windowsdesktop-10.0> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/dispatcher-timer/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/ui-thread-blocking/> ;
    schema:description "TickハンドラでUIスレッドの時間を使うため、重い処理やブロッキングI/Oを入れると入力や描画まで巻き込んで遅くなる"@ja ;
    ks:evidence <https://learn.microsoft.com/ja-jp/dotnet/api/system.windows.threading.dispatchertimer?view=windowsdesktop-10.0> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/dispatcher-timer/> ;
    rdf:predicate ks:notRecommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/precise-periodic-timing/> ;
    schema:description "DispatcherTimerは指定時刻ぴったりの発火を保証する道具ではなく、Dispatcherキュー上の他の仕事や優先度の影響を受ける"@ja ;
    ks:evidence <https://learn.microsoft.com/ja-jp/dotnet/api/system.windows.threading.dispatchertimer?view=windowsdesktop-10.0> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/dispatcher-timer/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/event-subscription-leak/> ;
    schema:description "DispatcherTimerのTick購読を解除せずStop()も呼ばずに画面を閉じると、タイマーがイベントハンドラを介してオブジェクトの寿命を引っ張ることがある"@ja ;
    ks:evidence <https://learn.microsoft.com/ja-jp/dotnet/api/system.windows.threading.dispatchertimer?view=windowsdesktop-10.0> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/winforms-timer/> ;
    rdf:predicate ks:notRecommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/precise-periodic-timing/> ;
    schema:description "System.Windows.Forms.Timerは精度が55ミリ秒程度が限界とされ、細かい周期には向かない"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.timer?view=windowsdesktop-10.0> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/reentrancy-guard/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/timer-callback-overlap/> ;
    schema:description "処理が重なりうる場合は、Interlocked.Exchangeなどのガードで多重実行を防ぐ設計にしたほうが安全という本記事の推奨"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.threading.interlocked.exchange> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/dispatcher-timer/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/wpf-dispatcher/> ;
    schema:description "DispatcherTimerはDispatcherキューに統合されたタイマーで、TickはDispatcher上で処理される"@ja ;
    ks:evidence <https://learn.microsoft.com/ja-jp/dotnet/api/system.windows.threading.dispatchertimer?view=windowsdesktop-10.0> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/wpf-dispatcher/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/dispatcher-priority/> ;
    schema:description "Dispatcherキュー上の処理はDispatcherPriorityの優先度に従って実行順序が決まる"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.windows.threading.dispatcherpriority?view=windowsdesktop-10.0> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .
