在 Asp.Net Core 中使用 worker services
ASP.Net Core 3.0 Preview 3 新增了一個(gè) worker services,那什么是 worker services 呢?它如同 windows服務(wù) 或者 Linux守護(hù)進(jìn)程 一樣的后臺(tái)服務(wù),在 Visual Studio 中提供了一個(gè)專門創(chuàng)建 ?worker services 的模板,如下圖:

值得注意的是要在 Visual Studio 中創(chuàng)建 worker services,你一定要裝 ASP.Net Core 3.0 或者 .Net Core 3.0 版本。
Program 類
worker service 的默認(rèn)實(shí)現(xiàn)包含了兩個(gè)類:Program 和 Worker 類, Program 類的功能差不多是合成了 傳統(tǒng)的 Asp.Net Core 上的 Program + Startup 兩個(gè)類的功能,還有一個(gè)專門用于寫業(yè)務(wù)邏輯的 Worker 類,下面是 Program 類的實(shí)現(xiàn),可以著重看一下 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 類
Work 類提供了對(duì) 依賴注入 的支持,它繼承于 Microsost.Extensions.Hosting.Abstractions 命名空間下的 BackgroundService,這個(gè)抽象的 BackgroundService 類又實(shí)現(xiàn)了 IHostedService 接口,還可以看出這個(gè)抽象類定義了四個(gè)方法聲明: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類的構(gòu)造函數(shù)接受 ILogger 類型的實(shí)例作為方法參數(shù),下面的代碼片段展示了這個(gè) Work 類的默認(rèn)實(shí)現(xiàn)。
???public?class?Worker?:?BackgroundService
????{
????????private?readonly?ILogger?_logger;
????????public?Worker(ILogger?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 執(zhí)行,要么做成 Windows服務(wù) 執(zhí)行,如果真要做成 Windows 服務(wù),你需要在 NuGet 上安裝一下 Microsoft.Extensions.Hosting.WindowsServices 包即可,程序跑起來后的輸出結(jié)果如下:

擴(kuò)展 workder service
如果想讓 worker service ?實(shí)現(xiàn)更加復(fù)雜的功能,可以自己重寫 BackgroundService 中的方法,比如說要執(zhí)行一些非常耗時(shí)的任務(wù),你可以重寫下面的 ExecuteAsync 方法,下面的代碼展示了如何自定義重寫 StartAsync,ExecuteAsync 和 StopAsync。
???public?class?Worker?:?BackgroundService
????{
????????private?readonly?ILogger?_logger;
????????public?Worker(ILogger?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 程序集,默認(rèn)的 worker service 是 ConsoleLogger,也就是僅記錄到 控制臺(tái) 上,實(shí)際業(yè)務(wù)中不可能這么玩,如果想記錄到其他地方該怎么做呢?比如 Windows Events 中,要這么做的話,可以使用 EventLog,在 nuget 上添加 Microsoft.Extensions.Logging.EventLog 包即可。
下面的代碼片段展示了如何在 CreateHostBuilder 方法中進(jìn)行配置將這個(gè)log記錄到 event 中。
public?static?IHostBuilder?CreateHostBuilder(string[]?args)?=>
????Host.CreateDefaultBuilder(args)
????????.ConfigureLogging(logFactory?=>?logFactory.AddEventLog())
????????.ConfigureServices(services?=>
????????{
????????????services.AddHostedService();
????????});?
譯文鏈接:https://www.infoworld.com/article/3432096/how-to-work-with-worker-services-in-aspnet-core.html
