ASP.NET Core 2.1でバックグラウンドジョブを実行したい。これは2時間ごとに実行する必要があり、データベースでいくつかのクリーンアップを実行するため、DIコンテナーにアクセスする必要があります。 async
である必要があり、ASP.NET Core 2.1アプリケーションとは独立して実行する必要があります。
IHostedService
が存在することを確認しましたが、ASP.NET Core 2.1はBackgroundService
と呼ばれる抽象クラスも導入しました。良さそうですね、使いたい!
ただし、タイマーでBackgroundService
から派生したサービスを実行する方法を理解できませんでした。
これをExecuteAsync(token)
で構成する必要がありますか?それが最後に実行された時間を思い出して、これが2時間であるかどうかを判断する必要がありますか時間?
また、私の問題への私のアプローチはBackgroundService
で正しいですか?
ありがとうございました!
編集:
これを MS extensions repo に投稿しました
@Panagiotis Kanavosが私の質問のコメントで回答しましたが、実際の回答として投稿しませんでした。この答えは彼/彼女に捧げられています。
サービスの作成には、Microsoftのドキュメントのように Timed background service を使用しました。
_internal class TimedHostedService : IHostedService, IDisposable
{
private readonly ILogger _logger;
private Timer _timer;
public TimedHostedService(ILogger<TimedHostedService> logger)
{
_logger = logger;
}
public Task StartAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("Timed Background Service is starting.");
_timer = new Timer(DoWork, null, TimeSpan.Zero,
TimeSpan.FromSeconds(5));
return Task.CompletedTask;
}
private void DoWork(object state)
{
_logger.LogInformation("Timed Background Service is working.");
}
public Task StopAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("Timed Background Service is stopping.");
_timer?.Change(Timeout.Infinite, 0);
return Task.CompletedTask;
}
public void Dispose()
{
_timer?.Dispose();
}
}
_
私の場合、new Timer(async () => await DoWorkAsync(), ...)
を実行して__timer
_を非同期で呼び出しました。
将来的には、このようなクラスをExtensionsリポジトリで利用できるようにする拡張機能を作成できると思います。これは非常に便利だと思います。説明にgithub issueリンクを投稿しました。
ヒント、このクラスを複数のホストされたサービスに再利用する場合は、タイマーと抽象PerformWork()
などを含む基本クラスを作成して、「時間」ロジックが1か所だけになるようにすることを検討してください。
ご回答ありがとうございます!これが将来の誰かの助けになることを願っています。
これを達成する1つの方法は、HangFire.ioを使用することです。これは、スケジュールされたバックグラウンドタスクを処理し、サーバー間のバランスを管理し、かなりスケーラブルです。
https://www.hangfire.io の定期的なジョブを参照してください