本文へスキップ
BecomeCoder

C#実践コース · 第11章 モダンC#実務 · レッスン66

Worker Service / BackgroundService

ローカル実施

導入

Webの応答とは別に、「定期的にバッチを回す」「キューを監視し続ける」といった常駐して働く処理が実務では必要です。.NETでは Worker ServiceBackgroundService)で書き、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 に常駐処理を書く
  • 停止要求は CancellationTokenstoppingToken)で受け取り、ループを抜ける
  • AddHostedService で登録すると、ホストの起動と一緒に走る
  • Windowsサービス・systemd・コンテナのいずれでも同じコードで動かせる

演習

手元で dotnet new worker を作り、Task.Delay を数秒に縮めてログが定期的に出るのを確認し、Ctrl+C で CancellationToken により綺麗に止まる様子を観察しましょう。

まとめ

  • Worker Service(BackgroundService)は常駐処理を書くしくみ
  • ExecuteAsync にループを書き、停止は CancellationToken で扱う
  • AddHostedService で登録し、サービス/コンテナとして動かす

次回: 高速な型付き通信 gRPC です(読み物)。