導入
Webの応答とは別に、「定期的にバッチを回す」「キューを監視し続ける」といった常駐して働く処理が実務では必要です。.NETでは Worker Service(BackgroundService)で書き、Windowsサービスや Linux の systemd、コンテナとして動かします。ホストが必要なため、ここではコード例で読みます。
説明
flowchart LR
HOST["Generic Host"] -->|起動| W["BackgroundService"]
W -->|ExecuteAsync のループ| JOB["定期処理(監視・集計・送信)"]
HOST -->|停止| STOP["CancellationToken で終了"]
style W fill:#e1f5fe
サンプル
public class ReportWorker : BackgroundService
{
private readonly ILogger<ReportWorker> _logger;
public ReportWorker(ILogger<ReportWorker> logger) => _logger = logger;
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
// 停止が要求されるまでループ
while (!stoppingToken.IsCancellationRequested)
{
_logger.LogInformation("集計バッチを実行");
await Task.Delay(TimeSpan.FromMinutes(1), stoppingToken);
}
}
}
// Program.cs: ホストに登録するだけで常駐する
var builder = Host.CreateApplicationBuilder(args);
builder.Services.AddHostedService<ReportWorker>();
builder.Build().Run();
BackgroundServiceを継承し、ExecuteAsyncに常駐処理を書く- 停止要求は
CancellationToken(stoppingToken)で受け取り、ループを抜ける AddHostedServiceで登録すると、ホストの起動と一緒に走る- Windowsサービス・systemd・コンテナのいずれでも同じコードで動かせる
演習
手元で dotnet new worker を作り、Task.Delay を数秒に縮めてログが定期的に出るのを確認し、Ctrl+C で CancellationToken により綺麗に止まる様子を観察しましょう。
まとめ
- Worker Service(
BackgroundService)は常駐処理を書くしくみ ExecuteAsyncにループを書き、停止はCancellationTokenで扱うAddHostedServiceで登録し、サービス/コンテナとして動かす
次回: 高速な型付き通信 gRPC です(読み物)。