<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          在 Asp.Net Core 中使用 worker services

          共 4206字,需瀏覽 9分鐘

           ·

          2021-01-11 22:00

          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è)類:ProgramWorker 類, 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,ExecuteAsyncStopAsync。


          ???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


          瀏覽 61
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  麻豆AV三级电影 | 青青草无码成人A片免费看 | 豆花.av | 欧美精品三级视频在线看 | 大香蕉中文网 |