在 Asp.Net Core 中使用 worker services

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 的默認實現包含了兩個類:ProgramWorker 類, 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 方法,下面的代碼展示瞭如何自定義重寫 StartAsyncExecuteAsyncStopAsync


   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 中。


public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureLogging(logFactory => logFactory.AddEventLog())
        .ConfigureServices(services =>
        {
            services.AddHostedService<Worker>();
        }); 

譯文鏈接:https://www.infoworld.com/article/3432096/how-to-work-with-worker-services-in-aspnet-core.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章