へっぽこプログラマーの備忘録
プログラムを中心とした個人的なメモ用のブログです。 タイトルは迷走中。
内容の保証はできませんのであしからずご了承ください。
menu
keyboard_arrow_up
Top
search
close
home
ホーム
computer
PC一般
construction
開発環境・ツール
code
プログラミング
home
ホーム
computer
PC一般
construction
開発環境・ツール
code
プログラミング
Home
›
ASP.NET Core
›
ASP.NET Core (.NET Core) でバックグランドタスクを起動する
2020/01/16
ASP.NET Core (.NET Core) でバックグランドタスクを起動する
update
event_note
label
.NET Core
label
ASP.NET Core
ASP.NET Core (.NET Core) において、アプリケーションの起動に合わせてバックグラウンドタスクを起動させる方法です。
- https://docs.microsoft.com/ja-jp/dotnet/standard/microservices-architecture/multi-container-microservice-net-applications/background-tasks-with-ihostedservice ## 環境 - Visual Studio 2017 - .NET Core 2.2 ## 概要 `IHostedService` を実装したサービスクラスを作成します。 `IHostedService` を使用するには、Nuget で `Microsoft.Extensions.Hosting` を追加する必要があります。 サービスクラスを `IHostedService` として DI コンテナに登録すると、Host が自動でバックグラウンドタスクとして実行してくれるようです。 Host については、作成するアプリケーションによって以下の2種類があるようです。 - ASP.NET Core で使用する Web ホスト (IWebHostBuilder) - ASP.NET Core 以外で使用する汎用ホスト (HostBuilder) ASP.NET Core の場合、テンプレートからプロジェクトを作成した段階で Web ホストが使用されている状態なので、特に意識はしなくても大丈夫そうですが、コンソールアプリなどの場合は汎用ホストを使用するように実装する必要があります。 ## ASP.NET Core の場合(Web ホスト) ASP.NET Core のほうが話が簡単なので、先に ASP.NET Core で説明します。 コンソールアプリなどでは必要となる汎用ホストについては後述します。 ### IHostedService の実装 [公式のドキュメント](https://docs.microsoft.com/ja-jp/dotnet/architecture/microservices/multi-container-microservice-net-applications/background-tasks-with-ihostedservice)に詳しく書いてありますが、ほとんどのバックグラウンドタスクではタスクの開始や終了といった動作は同じであるため、`IHostedService` を実装した抽象クラスを作成しておくと良いようです。 サンプルコードをそのまま引用します。 ```cs // Copyright (c) .NET Foundation. Licensed under the Apache License, Version 2.0. ///
/// Base class for implementing a long running
. ///
public abstract class BackgroundService : IHostedService, IDisposable { private Task _executingTask; private readonly CancellationTokenSource _stoppingCts = new CancellationTokenSource(); protected abstract Task ExecuteAsync(CancellationToken stoppingToken); public virtual Task StartAsync(CancellationToken cancellationToken) { // Store the task we're executing _executingTask = ExecuteAsync(_stoppingCts.Token); // If the task is completed then return it, // this will bubble cancellation and failure to the caller if (_executingTask.IsCompleted) { return _executingTask; } // Otherwise it's running return Task.CompletedTask; } public virtual async Task StopAsync(CancellationToken cancellationToken) { // Stop called without start if (_executingTask == null) { return; } try { // Signal cancellation to the executing method _stoppingCts.Cancel(); } finally { // Wait until the task completes or the stop token triggers await Task.WhenAny(_executingTask, Task.Delay(Timeout.Infinite, cancellationToken)); } } public virtual void Dispose() { _stoppingCts.Cancel(); } } ``` そして、この抽象クラスを継承してバックグランドで動かしたいサービスクラスを定義します。 コードの概要は以下です。 ```cs public class SampleService : BackgroundService { public SampleService() { // コンストラクタへの引数は自動で DI される } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { // ここに常駐処理を定義する } } ``` `ExecuteAsync` 内では `while` で常駐処理を定義し、タスクの終了のチェックなども行います。 以下、[公式のドキュメント](https://docs.microsoft.com/ja-jp/dotnet/architecture/microservices/multi-container-microservice-net-applications/background-tasks-with-ihostedservice)のサンプルを引用します。 ```cs public class GracePeriodManagerService : BackgroundService { private readonly ILogger
_logger; private readonly OrderingBackgroundSettings _settings; private readonly IEventBus _eventBus; public GracePeriodManagerService(IOptions
settings, IEventBus eventBus, ILogger
logger) { //Constructor’s parameters validations... } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { _logger.LogDebug($"GracePeriodManagerService is starting."); stoppingToken.Register(() => _logger.LogDebug($" GracePeriod background task is stopping.")); while (!stoppingToken.IsCancellationRequested) { _logger.LogDebug($"GracePeriod task doing background work."); // This eShopOnContainers method is querying a database table // and publishing events into the Event Bus (RabbitMQ / ServiceBus) CheckConfirmedGracePeriodOrders(); await Task.Delay(_settings.CheckUpdateTime, stoppingToken); } _logger.LogDebug($"GracePeriod background task is stopping."); } .../... } ``` ### DI コンテナへのサービスの追加 `Startup.cs` の `ConfigureServices` メソッドで、サービスクラスを DI コンテナに登録します。 `IHostedService` を実装したクラスを `AddHostedService` で登録していきます。 (`AddSingleton` でも可) ```cs public void ConfigureServices(IServiceCollection services) { // ... services.AddHostedService
(); services.AddHostedService
(); // または services.AddSingleton
(); services.AddSingleton
(); } ``` ## 汎用ホスト ASP.NET Core 以外(例えばコンソールアプリなど)では汎用ホストを作成する必要があります。 基本的なコードは以下です。 ```cs public static async Task Main(string[] args) { var host = new HostBuilder() .Build(); await host.RunAsync(); } ``` ### IHostedService の実装 前述の ASP.NET Core と同様のため省略します。 ### DI コンテナへのサービス追加 `IHostedService` を DI するためにも、DI コンテナにサービスを追加する必要があります。 `ConfigureServices` で行います。 ```cs var host = new HostBuilder() .ConfigureServices((hostContext, services) => { services.AddHostedService
(); services.AddHostedService
(); // または services.AddSingleton
(); services.AddSingleton
(); }) .Build(); await host.RunAsync(); ``` `ConfigureServices` の中身については ASP.NET Core と同じです。 他にもいろいろ設定可能ですが、ここでは DI コンテナしか関係ないので、省略します。 詳細は以下を参照してください。 - https://docs.microsoft.com/ja-jp/aspnet/core/fundamentals/host/generic-host
## 参考 URL - https://docs.microsoft.com/ja-jp/dotnet/standard/microservices-architecture/multi-container-microservice-net-applications/background-tasks-with-ihostedservice - https://docs.microsoft.com/ja-jp/aspnet/core/fundamentals/host/hosted-services?view=aspnetcore-2.2 - https://docs.microsoft.com/ja-jp/aspnet/core/fundamentals/host/generic-host?view=aspnetcore-2.2
tweet
facebook
Pocket
B!
はてブ
LINE
chevron_left
chevron_right
Translate
Popular Posts
TortoiseGit でコミットメッセージを変更する
image
NO IMAGE
smbclient で session setup failed: NT_STATUS_LOGON_FAILURE が表示される
Docker for Windows の設定
image
NO IMAGE
マージ元ブランチとマージ先ブランチ
image
NO IMAGE
TortoiseSVN ロック状態のチェック
TortoiseGit でブランチ間の差分を見る
image
NO IMAGE
Visual Studio で文字がにじむ(ぼやける)
image
NO IMAGE
AsciidocFX をビルドする
image
NO IMAGE
PowerShellでブレークポイントが設定できない場合
[Python] 文字列の判定で、None と空文字を同時に判定する
Labels
.NET Core
31
.NET Framework
17
.NET Standard
2
AdminLTE
1
AI
1
Apache
3
AppVeyor
2
AsciiDoc
7
ASP.NET Core
55
Atom
4
AWS
5
AWS Cloud9
4
blockdiag
1
Blogger
13
Bootstrap
3
C/C++
6
C#
106
CentOS
3
Chrome
1
Chronograf
3
chrony
1
Codecov
1
CSS
1
Docker
80
DokuWiki
4
Doxygen
1
draw.io
1
EasyTag
1
Electron
1
Electron.NET
2
Entity Framework Core
9
Excel
2
FFmpeg
3
Firefox
6
Flask
1
Git
19
GitBook
4
GitBucket
7
GitHub
7
GitLab
39
Go
1
Google
1
Google Cloud Platform
1
Grafana
13
GStreamer
2
HTML
5
IIS
8
InfluxDB
14
JavaScript
15
Jekyll
2
Jenkins
7
Linux
34
Log4View
1
MahApps.Metro
3
MaterialDesignInXamlToolkit
1
MkDocs
2
MongoDB
5
MVC
1
MVVM
6
nginx
3
NLog
3
Node.js
8
npm
1
NVIDIA
3
onvif
1
OpenAPI
2
OpenCV
4
OpenSSL
3
OpenVINO
2
ownCloud
2
pandas
1
Pine Script
1
PlantUML
5
Portainer
3
PowerShell
8
Prism
2
PySide
19
Python
88
PyTorch
1
RabbitVCS
1
Razor
3
redis
1
Redmine
33
Redoc
1
remark.js
2
rocketchat
10
Ruby
3
scikit-learn
1
shotcut
1
SignalR
1
Slack
1
Socket.IO
1
SonarQube
5
Sphinx
10
SQL Server
5
SQLite
1
StableDiffusion
1
Subversion
2
Swagger
1
Swarmpit
1
Syslog
3
Telegraf
6
Tesseract
3
TestLink
2
Tomcat
2
TortoiseGit
11
TortoiseSVN
2
Trading View
1
Traefik
3
Travis CI
1
Ubuntu
31
Visual Studio
39
Visual Studio Code
10
VSCode
8
Vue.js
8
Windows
62
Windows 10
5
Windows ADK
1
Windows API
2
Windows Embedded
4
wkhtmltopdf
2
Word
3
WPF
12
WSL
5
WSL2
5
Xamarin
1
xUnit
5
yaml
1
yolo
1
アプリケーション
1
デザインパターン
1
テスト
1
バッチファイル
2
プログラミング
4
ライセンス
1
暗号資産(仮想通貨)
1
英語
2
確定申告
1
機械学習
1
強化学習
1
雑記
1
書籍
1
数学
1
正規表現
1
動画編集
1
Blog Archive
►
2024
(18)
►
9月
(5)
►
8月
(1)
►
7月
(2)
►
6月
(1)
►
4月
(2)
►
3月
(1)
►
2月
(5)
►
1月
(1)
►
2023
(30)
►
12月
(3)
►
11月
(5)
►
10月
(2)
►
9月
(1)
►
8月
(2)
►
7月
(4)
►
6月
(2)
►
5月
(3)
►
4月
(2)
►
3月
(2)
►
2月
(3)
►
1月
(1)
►
2022
(106)
►
12月
(5)
►
11月
(1)
►
10月
(3)
►
9月
(6)
►
8月
(7)
►
7月
(6)
►
6月
(13)
►
5月
(9)
►
4月
(15)
►
3月
(11)
►
2月
(14)
►
1月
(16)
►
2021
(85)
►
12月
(11)
►
11月
(6)
►
10月
(4)
►
9月
(10)
►
8月
(8)
►
7月
(4)
►
6月
(18)
►
5月
(7)
►
4月
(8)
►
3月
(2)
►
2月
(2)
►
1月
(5)
▼
2020
(56)
►
12月
(1)
►
11月
(3)
►
10月
(3)
►
9月
(3)
►
8月
(3)
►
7月
(7)
►
6月
(7)
►
5月
(2)
►
4月
(6)
►
3月
(6)
►
2月
(3)
▼
1月
(12)
[JavaScript] 数値の変わった表記
[Python] インデックス付きのループ
ASP.NET Core (.NET Core) でバックグランドタスクを起動する
NuGet Server でプライベートリポジトリを構築する
GitLab の Admin / Runners で 500 エラーが表示される
[C#] 動的な JSON を扱う
[Python] 書式指定で変数を使う
[Python] 文字列の出力
VSCode での Python のデバッグ設定
VSCode で Python の import や from のエラーが消えない
Python で ta-lib をインストールする
Windows に Python をインストール
►
2019
(92)
►
12月
(13)
►
11月
(9)
►
10月
(3)
►
9月
(2)
►
8月
(3)
►
7月
(5)
►
6月
(11)
►
5月
(6)
►
4月
(17)
►
3月
(9)
►
2月
(6)
►
1月
(8)
►
2018
(100)
►
12月
(1)
►
11月
(11)
►
10月
(8)
►
9月
(6)
►
8月
(10)
►
7月
(10)
►
6月
(8)
►
5月
(9)
►
4月
(8)
►
3月
(14)
►
2月
(4)
►
1月
(11)
►
2017
(117)
►
12月
(14)
►
11月
(20)
►
10月
(17)
►
9月
(19)
►
8月
(10)
►
7月
(8)
►
6月
(3)
►
5月
(6)
►
4月
(5)
►
3月
(2)
►
2月
(8)
►
1月
(5)
►
2016
(91)
►
12月
(5)
►
11月
(9)
►
10月
(11)
►
9月
(9)
►
8月
(6)
►
7月
(14)
►
6月
(14)
►
5月
(11)
►
4月
(10)
►
3月
(2)
►
2015
(23)
►
12月
(4)
►
11月
(2)
►
10月
(8)
►
9月
(8)
►
7月
(1)
►
2013
(3)
►
11月
(1)
►
9月
(1)
►
7月
(1)
►
2012
(2)
►
7月
(1)
►
6月
(1)
►
2011
(1)
►
9月
(1)
►
2009
(1)
►
7月
(1)
►
2008
(2)
►
11月
(1)
►
7月
(1)
►
2007
(3)
►
10月
(3)