栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

如何在 ASP.Net Core 中使用 worker services

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何在 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 的默认实现包含了两个类: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 类

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 _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 执行,要么做成 Windows服务 执行,如果真要做成 Windows 服务,你需要在 NuGet 上安装一下 Microsoft.Extensions.Hosting.WindowsServices 包即可,程序跑起来后的输出结果如下:

扩展 workder service

如果想让 worker service 实现更加复杂的功能,可以自己重写 BackgroundService 中的方法,比如说要执行一些非常耗时的任务,你可以重写下面的 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 程序集,默认的 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();
 }); 

更多高质量干货:参见我的 GitHub: [csharptranslate] github.com/ctripxchuang/csharptranslate

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号