ASP.Net Core 3.0 Preview 3 新增了一個 worker services,那什麼是 worker services 呢? 它如同 windows服務 或者 Linux守護程序 一樣的後臺服務,在 Visual Studio 中提供了一個專門建立 worker services 的模板,如下圖:
值得注意的是要在 Visual Studio 中建立 worker services,你一定要裝 ASP.Net Core 3.0 或者 .Net Core 3.0 版本。
Program 類worker service 的預設實現包含了兩個類:Program
和 Worker
類, Program 類的功能差不多是合成了 傳統的 Asp.Net Core 上的 Program + Startup
兩個類的功能,還有一個專門用於寫業務邏輯的 Worker 類,下面是 Program 類的實現,可以著重看一下 AddHostedService 是如何使用的。
public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureServices((hostContext, services) => { services.AddHostedService<Worker>(); }); }
Worker 類
Work 類提供了對 依賴注入 的支援,它繼承於 Microsost.Extensions.Hosting.Abstractions 名稱空間下的 BackgroundService,這個抽象的 BackgroundService 類又實現了 IHostedService 介面,還可以看出這個抽象類定義了四個方法宣告:StartAsync
,StopAsync
,ExecuteAsync
,Dispose
。
public abstract class BackgroundService : IHostedService, IDisposable{ public virtual void Dispose(); public virtual Task StartAsync(CancellationToken cancellationToken); public virtual Task StopAsync(CancellationToken cancellationToken); protected abstract Task ExecuteAsync(CancellationToken stoppingToken);}
Worker類的建構函式接受 ILogger 型別的例項作為方法引數,下面的程式碼片段展示了這個 Work 類的預設實現。
public class Worker : BackgroundService { private readonly ILogger<Worker> _logger; public Worker(ILogger<Worker> logger) { _logger = logger; } protected override async Task ExecuteAsync (CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { _logger.LogInformation ("Worker running at: {time}", DateTimeOffset.Now); await Task.Delay(1000, stoppingToken); } } }
要想把 worker service 跑起來,有兩種途徑,要麼雙擊 exe 執行,要麼做成 Windows服務 執行,如果真要做成 Windows 服務,你需要在 NuGet 上安裝一下 Microsoft.Extensions.Hosting.WindowsServices 包即可,程式跑起來後的輸出結果如下:
擴充套件 workder service如果想讓 worker service 實現更加複雜的功能,可以自己重寫 BackgroundService 中的方法,比如說要執行一些非常耗時的任務,你可以重寫下面的 ExecuteAsync 方法,下面的程式碼展示瞭如何自定義重寫 StartAsync
,ExecuteAsync
和 StopAsync
。
public class Worker : BackgroundService { private readonly ILogger<Worker> _logger; public Worker(ILogger<Worker> logger) { _logger = logger; } public override Task StartAsync(CancellationToken cancellationToken) { _logger.LogInformation ("Worker service has been started at: {0}", DateTime.Now); return base.StartAsync(cancellationToken); } protected override Task ExecuteAsync(CancellationToken stoppingToken) { _logger.LogInformation ("Worker service running at: {0}", DateTime.Now); return Task.CompletedTask; } public override Task StopAsync(CancellationToken cancellationToken) { _logger.LogInformation ("Worker service has been stopped at: {0}", DateTime.Now); return base.StopAsync(cancellationToken); } public override void Dispose() { _logger.LogInformation ("Worker service has been disposed at: {0}", DateTime.Now); base.Dispose(); } }
worker service 日誌功能要想在 worker service 中記錄日誌,可以新增 Microsoft.Extensions.Logging 程式集,預設的 worker service 是 ConsoleLogger,也就是僅記錄到 控制檯 上,實際業務中不可能這麼玩,如果想記錄到其他地方該怎麼做呢?比如 Windows Events 中,要這麼做的話,可以使用 EventLog,在 nuget 上新增 Microsoft.Extensions.Logging.EventLog 包即可。
下面的程式碼片段展示瞭如何在 CreateHostBuilder 方法中進行配置將這個log記錄到 event 中。