如何在ASP.Net Core中使用辅助服务

ASP.Net Core 3.0 Preview 3添加了对创建工作程序服务的支持,这些工作程序是诸如Windows服务和Linux守护程序之类的后台服务。 还有一个用于在Visual Studio中创建辅助服务的新模板。

要在Visual Studio中使用辅助服务,您应该在系统上安装ASP.Net Core 3.0和.Net Core 3.0运行时的beta版(预览版3或更高版本)。

[Microsoft .Net 5将.Net Framework和.Net Core结合在一起:了解.Net Standard和.Net Core的合并对开发人员意味着什么 | 从InfoWorld的Microsoft Architect博客中了解如何从.Net Framework和.Net Core中获得最大收益。 | 通过InfoWorld的App Dev Report新闻通讯了解编程方面的热门话题。 ]

创建一个新的工作人员服务应用程序

首先,让我们在Visual Studio 2019中创建一个ASP.Net Core项目。请按照以下步骤在Visual Studio中创建一个新的ASP.Net Core项目:

  1. 启动Visual Studio IDE。
  2. 单击创建新项目。
  3. 在“创建新项目”窗口中,从模板列表中选择“ ASP.Net Core Web应用程序”。
  4. 点击下一步。
  5. 在出现的“配置新项目”窗口中,指定新项目的名称和位置。
  6. 单击创建。
  7. 出现创建新ASP.Net Core Web应用程序窗口。
  8. 选择.Net Core作为运行时,并从顶部的下拉菜单中选择ASP.Net Core 3.0(或更高版本)。
  9. 选择Worker Service作为项目模板以创建新的Worker Service应用程序
  10. 确保未选中“启用Docker支持”复选框,因为此处不会使用此功能。
  11. 确保将“身份验证”设置为“无身份验证”,因为您也不会使用身份验证。
  12. 单击创建。

这将在Visual Studio中创建一个新的工作程序服务应用程序。

工人服务1 IDG

ASP.Net Core中的新工作程序服务。

程序类

Worker服务的默认实现包含两个类:Program和Worker类。 Program类类似于Web应用程序中的类,不同之处在于,您拥有一个Worker类而不是Startup类。 这是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类为依赖项注入提供支持。 Worker服务类扩展了Microsost.Extensions.Hosting.Abstractions包中的BackgroundService类。 所述BackroundService抽象类扩展IHostedService接口和包含的声明StartAsyncStopAsync ,和ExecuteAsync方法。

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类型的实例作为参数。 以下代码段显示了Worker类的默认实现:

   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);
            }
        }
    }
工人服务2 IDG

您可以将工作程序服务作为Visual Studio中的.exe文件运行,甚至可以作为Windows服务运行。 若要将工作程序服务作为Windows服务运行,应将Microsoft.Extensions.Hosting.WindowsServices NuGet包添加到项目中。

您可以像在Visual Studio中运行应用程序一样来运行worker服务:按F5或Ctrl + F5。 当您运行简约工作程序服务时,该图显示了输出结果。

扩展默认工作程序服务

您可以重写BackgroundService抽象类的方法,以向工作程序服务添加更多功能。 您可以重写ExecuteAsync方法以编写用于执行任何长时间运行的任务的代码。 以下代码显示了Worker类的增强版本; 在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();
        }
    } 

在工作者服务中记录数据

要在辅助服务中使用日志记录,应添加对Microsoft.Extensions.Logging程序集的引用。 辅助服务中的默认记录器为ConsoleLogger。 您还可以将EventLog用作辅助服务中的日志目标。 要将EventLog用作日志目标,请将Microsoft.Extensions.Logging.EventLog NuGet包添加到您的项目中。

以下代码段说明了如何在Program类的CreateHostBuilder方法中将日志记录输出配置为事件日志:

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值