不管是在控制台程式還是asp.net core程式中,我們經常會有用到一個需要長時間運行的後臺任務的需求。通常最直覺的方式是使用Thread實例來新建一個線程,但是這樣需要自行管理線程的啟動和停止。 在.net core中提供了一個繼承自IHostedService的基類BackgroudServi ...
不管是在控制台程式還是asp.net core
程式中,我們經常會有用到一個需要長時間運行的後臺任務的需求。通常最直覺的方式是使用Thread
實例來新建一個線程,但是這樣需要自行管理線程的啟動和停止。
在.net core
中提供了一個繼承自IHostedService
的基類BackgroudService
能夠方便地實現一個長程的後臺任務。
為了使用這個基類進行開發,我們需要向項目中添加包:Microsoft.Extensions.Hosting
然後新建一個後臺任務類AppHostedService
並實現ExecuteAsync
方法即可。
一個簡單的ExecuteAsync
任務實現
protected override async Task<object> ExecuteAsync(CancellationToken stoppingToken)
{
int loop = 0;
while (!stoppingToken.IsCancellationRequested) {
try {
Console.WriteLine("Backgroun service working...");
await Task.Delay(5000, stoppingToken);
} catch(TaskCanceledException exception)
{
Console.WriteLine($"TaskCanceledException Error: {exception.Message}");
}
}
return Task.CompletedTask;
}
另外在主程式中使用Host.CreateDefaultBuilder()
來創建運行程式的托管服務並加入我們剛剛創建的AppHostedService
await Host.CreateDefaultBuilder()
.UseConsoleLifetime()
.ConfigureServices((context, services) => {
services.AddHostedService<AppHostService>();
})
.RunConsoleAsync();
創建完成後編譯運行,將看到托管服務的啟動輸出信息和在任務中周期性輸出的信息。完整代碼見Gist
Hello, World!
Start Async AppHostService
Backgroun service working...
info: Microsoft.Hosting.Lifetime[0]
Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
Hosting environment: Production
info: Microsoft.Hosting.Lifetime[0]
Content root path: C:\Users\ZhouXinfeng\tmp\hostservice\bin\Debug\net8.0
Background service working...
Background service working...
Background service working...
Background service working...
Background service working...
Background service working...
Background service working...
Background service working...
參考鏈接
- .NET Core 實現後臺任務(定時任務)BackgroundService(二)(https://www.cnblogs.com/ysmc/p/16468560.html)
- Background tasks with hosted services in ASP.NET Core
- The "correct" way to create a .NET Core console app without background services