@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-generic-host-backgroundservice-desktop-app/#article>
    schema:about <https://comcomponent.com/knowledge/generic-host/>, <https://comcomponent.com/knowledge/backgroundservice/> ;
    schema:mentions <https://comcomponent.com/knowledge/hosted-service/>, <https://comcomponent.com/knowledge/ihostapplicationlifetime/>, <https://comcomponent.com/knowledge/graceful-shutdown/>, <https://comcomponent.com/knowledge/shutdowntimeout-hostoption/>, <https://comcomponent.com/knowledge/periodictimer/>, <https://comcomponent.com/knowledge/channel-t/>, <https://comcomponent.com/knowledge/ihostedlifecycleservice/>, <https://comcomponent.com/knowledge/wpf/>, <https://comcomponent.com/knowledge/windows-forms/>, <https://comcomponent.com/knowledge/dependency-injection-dotnet/>, <https://comcomponent.com/knowledge/environment-exit/>, <https://comcomponent.com/knowledge/cancellationtoken-dotnet/>, <https://comcomponent.com/knowledge/taskrun-dotnet/>, <https://comcomponent.com/knowledge/dotnet/> .

<https://comcomponent.com/knowledge/generic-host/> a skos:Concept ;
    skos:prefLabel "Generic Host"@ja ;
    skos:definition "構成・DI・ロギングをまとめて面倒を見る.NETの土台。Host.CreateApplicationBuilderを使うと既定の構成プロバイダーの階層が組み立てられる。"@ja ;
    skos:altLabel "HostApplicationBuilder" ;
    skos:altLabel "Host.CreateApplicationBuilder" ;
    ks:uses <https://comcomponent.com/knowledge/hosted-service/> ;
    ks:uses <https://comcomponent.com/knowledge/dependency-injection-dotnet/> ;
    ks:configuredBy <https://comcomponent.com/knowledge/shutdowntimeout-hostoption/> ;
    ks:requires <https://comcomponent.com/knowledge/dotnet/> .

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

<https://comcomponent.com/knowledge/hosted-service/> a skos:Concept ;
    skos:prefLabel "Hosted Service (IHostedService)"@ja ;
    skos:definition "hostの寿命にぶら下がって開始・停止される常駐処理を表すインターフェース。"@ja ;
    skos:altLabel "IHostedService" .

<https://comcomponent.com/knowledge/dependency-injection-dotnet/> a skos:Concept ;
    skos:prefLabel "依存性注入(DI)"@ja ;
    skos:definition "クラスが必要とする相手を自分でnewせず外から渡してもらう設計手法。渡す相手をまとめて登録する置き場がDIコンテナー(IServiceProvider)で、Generic Hostは最初からこれを持つ。"@ja ;
    skos:altLabel "Dependency Injection" ;
    skos:altLabel "IServiceProvider" ;
    skos:altLabel "依存性注入 (DI)"@ja ;
    skos:altLabel "DIコンテナ"@ja .

<https://comcomponent.com/knowledge/wpf/> a skos:Concept ;
    skos:prefLabel "WPF"@ja ;
    skos:definition "XAMLでUIを宣言的に記述する、Windows専用のデスクトップUIフレームワーク。ベクターベースの描画とデータバインディングを特徴とする。"@ja ;
    skos:altLabel "Windows Presentation Foundation" .

<https://comcomponent.com/knowledge/windows-forms/> a skos:Concept ;
    skos:prefLabel "Windows Forms"@ja ;
    skos:definition "デスクトップGUIアプリケーションを構築するための.NET/.NET FrameworkのUIフレームワーク。"@ja ;
    skos:altLabel "WinForms" .

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

<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/channel-t/> a skos:Concept ;
    skos:prefLabel "Channel<T>"@ja ;
    skos:definition "producer/consumerの形をWriteAsync/ReadAsyncで書けるキュー。境界付き(bounded)にするとbackpressureが働く。"@ja ;
    skos:altLabel "System.Threading.Channels" .

<https://comcomponent.com/knowledge/graceful-shutdown/> a skos:Concept ;
    skos:prefLabel "graceful shutdown"@ja ;
    skos:definition "強制終了ではなく、止める合図を出して進行中の処理をなるべく整えてから終了させる終了方式。"@ja ;
    skos:altLabel "正常終了処理"@ja ;
    ks:requires <https://comcomponent.com/knowledge/cancellationtoken-dotnet/> .

<https://comcomponent.com/knowledge/shutdowntimeout-hostoption/> a skos:Concept ;
    skos:prefLabel "HostOptions.ShutdownTimeout"@ja ;
    skos:definition "IHost.StopAsyncが終了処理を待つ既定の上限時間を制御するオプション。既定値は.NET 6で5秒、.NET 7以降は30秒。"@ja ;
    skos:altLabel "ShutdownTimeout" .

<https://comcomponent.com/knowledge/environment-exit/> a skos:Concept ;
    skos:prefLabel "Environment.Exit"@ja ;
    skos:definition "指定した終了コードでプロセスを即座に終了させる.NETの静的メソッド。"@ja ;
    skos:altLabel "Environment.Exit メソッド"@ja ;
    ks:incompatibleWith <https://comcomponent.com/knowledge/graceful-shutdown/> .

<https://comcomponent.com/knowledge/ihostapplicationlifetime/> a skos:Concept ;
    skos:prefLabel "IHostApplicationLifetime"@ja ;
    skos:definition "アプリ全体の起動・停止イベントの通知と、正常終了への正規ルートであるStopApplicationメソッドを提供するインターフェース。"@ja ;
    skos:altLabel "StopApplication" ;
    ks:recommendedFor <https://comcomponent.com/knowledge/graceful-shutdown/> .

<https://comcomponent.com/knowledge/ihostedlifecycleservice/> a skos:Concept ;
    skos:prefLabel "IHostedLifecycleService"@ja ;
    skos:definition "StartingやStartedなど、IHostedServiceより細かい起動・停止タイミングのフックを提供するインターフェース。"@ja ;
    skos:altLabel "Hosted Lifecycle Service" .

<https://comcomponent.com/knowledge/taskrun-dotnet/> a skos:Concept ;
    skos:prefLabel "Task.Run"@ja ;
    skos:definition "CPUを使う処理を.NETスレッドプールのワーカースレッドへ明示的にオフロードするためのAPI。I/OバウンドのTaskに使う必要はない。"@ja ;
    ks:notRecommendedFor <https://comcomponent.com/knowledge/hosted-service/> .

<https://comcomponent.com/knowledge/dotnet/> a skos:Concept ;
    skos:prefLabel ".NET(Core以降)"@ja ;
    skos:definition ".NET Frameworkの後継となる、クロスプラットフォーム対応の.NETランタイム(.NET 5以降)。"@ja ;
    skos:altLabel ".NET Core" ;
    skos:altLabel "モダンな.NET"@ja .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/backgroundservice/> ;
    rdf:predicate ks:implements ;
    rdf:object <https://comcomponent.com/knowledge/hosted-service/> ;
    schema:description "BackgroundServiceはIHostedServiceの書きやすい実装補助で、長く走る本体をExecuteAsyncに書けるようにする。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/microsoft.extensions.hosting.backgroundservice> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/generic-host/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/hosted-service/> ;
    schema:description "Generic Hostは登録されたHosted Serviceをhostの寿命にぶら下げて開始・停止する。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/core/extensions/generic-host> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/generic-host/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/dependency-injection-dotnet/> ;
    schema:description "Generic HostはHost.CreateApplicationBuilderでDIコンテナ・構成・ログの土台を1か所にそろえる。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/core/extensions/generic-host> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/wpf/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/generic-host/> ;
    schema:description "Generic Hostを採用する構成では、WPFアプリはApp.OnStartupでHostをbuild・startし、起動とlifetimeの管理をGeneric Hostに任せられる。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/desktop/wpf/overview/> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/windows-forms/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/generic-host/> ;
    schema:description "WinFormsアプリでも入口がMain / ApplicationContextに変わるだけでGeneric Hostの考え方はほぼ同じだが、細部はWPFと完全に同一ではない。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/desktop/winforms/overview/> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/backgroundservice/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/periodictimer/> ;
    schema:description "ExecuteAsyncの本体で一定間隔の周期処理を書く場合、PeriodicTimerを使う。メッセージ待ち受けや外部イベント駆動など周期処理でないBackgroundServiceには使わない。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.threading.periodictimer> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/backgroundservice/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/cancellationtoken-dotnet/> ;
    schema:description "ExecuteAsyncはstoppingTokenを最初から最後まで通し、停止合図を受け取ってループを抜ける。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/backgroundservice/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/channel-t/> ;
    schema:description "順番付きのバックグラウンド後処理は、投げっぱなしより寿命と上限を管理しやすいChannel<T>とBackgroundServiceの組み合わせで実装できる。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/core/extensions/channels> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/backgroundservice/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/dependency-injection-dotnet/> ;
    schema:description "BackgroundServiceはコンストラクター注入でIServiceScopeFactoryやloggerなどのDIサービスを受け取り、scopedな依存には毎回scopeを切る。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/core/extensions/dependency-injection> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/graceful-shutdown/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/cancellationtoken-dotnet/> ;
    schema:description "graceful shutdownはCancellationToken(stoppingToken)による停止通知とStopAsyncの組み合わせを前提とする。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/generic-host/> ;
    rdf:predicate ks:configuredBy ;
    rdf:object <https://comcomponent.com/knowledge/shutdowntimeout-hostoption/> ;
    schema:description "Generic HostのIHost.StopAsyncが終了処理を待つ上限時間は、HostOptions.ShutdownTimeoutで構成できる。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/microsoft.extensions.hosting.hostoptions.shutdowntimeout> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/environment-exit/> ;
    rdf:predicate ks:incompatibleWith ;
    rdf:object <https://comcomponent.com/knowledge/graceful-shutdown/> ;
    schema:description "Environment.Exitで即座にプロセスを終了させると、hostが持つgraceful shutdownの経路を自分で切ってしまう。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.environment.exit> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/ihostapplicationlifetime/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/graceful-shutdown/> ;
    schema:description "致命的エラーで全体を終了させたいときは、Environment.Exitではなく IHostApplicationLifetime.StopApplication() で正規の停止ルートを通すことが推奨される。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/microsoft.extensions.hosting.ihostapplicationlifetime> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/generic-host/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/ihostedlifecycleservice/> ;
    schema:description "起動タイミングをより厳密に制御したい場合は、Generic Hostの選択肢としてIHostedLifecycleServiceが視野に入る。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/microsoft.extensions.hosting.ihostedlifecycleservice> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/taskrun-dotnet/> ;
    rdf:predicate ks:notRecommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/hosted-service/> ;
    schema:description "常駐ループをTask.Run投げっぱなしで始めると寿命・例外の持ち主が曖昧になるため、Hosted Service(BackgroundService)に載せることが推奨される。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/microsoft.extensions.hosting.backgroundservice> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/backgroundservice/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/dotnet/> ;
    schema:description "BackgroundServiceはMicrosoft.Extensions.Hostingパッケージとして.NET(Core以降)のうえで提供される。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/microsoft.extensions.hosting.backgroundservice> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/generic-host/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/dotnet/> ;
    schema:description "Generic Hostは.NET(Core以降)のホスティング機能として提供される。"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/core/introduction> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .
