dot net core使用BackgroundService執行一個後臺服務

mrchip發表於2024-05-27

不管是在控制檯程式還是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...

參考連結

  1. .NET Core 實現後臺任務(定時任務)BackgroundService(二)(https://www.cnblogs.com/ysmc/p/16468560.html)
  2. Background tasks with hosted services in ASP.NET Core
  3. The "correct" way to create a .NET Core console app without background services

相關文章