前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【愚公系列】2022年5月 ASP.NET Core下Worker Service构建系统服务实现任务调度

【愚公系列】2022年5月 ASP.NET Core下Worker Service构建系统服务实现任务调度

作者头像
愚公搬代码
发布2022-12-01 09:13:14
6060
发布2022-12-01 09:13:14
举报
文章被收录于专栏:历史专栏

文章目录


前言

当你想到ASP.NET Core时,可能会想到Web应用程序后端代码,包括MVC和WebAPI。MVC视图和Razor页面还允许使用后端代码生成带有HTML元素的前端UI。全新的Blazor更进一步,允许使用WebAssembly在Web浏览器中运行客户端.NET代码。最后,我们现在有了一个Worker Service应用程序的模板。

这是在ASP.NET Core早期预览中引入的。虽然项目模板最初列在Web模板下,但此后在向导中重新定位了一个级别。这是在.NET Core中创建长时间运行的跨平台服务的好方法。

命令行创建如下

代码语言:javascript
复制
dotnet new worker -o myproject

一、ASP.NET Core Worker Service构建系统服务实现任务调度

1.安装对应包

使用vs2022创建Worker Service程序,nuget安装如下包:

代码语言:javascript
复制
Microsoft.Extensions.Hosting.WindowsServices

2.添加window服务扩展

在Program中添加UseWindowsService()

worker service 的默认实现包含了两个类:Program 和 Worker 类, Program 类的功能差不多是合成了 传统的 Asp.Net Core 上的 Program + Startup 两个类的功能,还有一个专门用于写业务逻辑的 Worker 类,下面是 Program 类的实现,可以着重看一下 AddHostedService 是如何使用的。

代码语言:javascript
复制
IHost host = Host.CreateDefaultBuilder(args)
    .ConfigureServices(services =>
    {
        services.AddHostedService<Worker>();
    }).UseWindowsService()
    .Build();

await host.RunAsync();

实际任务执行代码Worker类

Work 类提供了对 依赖注入 的支持,它继承于 Microsost.Extensions.Hosting.Abstractions 命名空间下的 BackgroundService,这个抽象的 BackgroundService 类又实现了 IHostedService 接口,还可以看出这个抽象类定义了四个方法声明:StartAsync,StopAsync,ExecuteAsync,Dispose。

代码语言:javascript
复制
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)
        {
            //实际要执行的任务代码
            await Task.Delay(8640000, stoppingToken);
        }
    }
}

3.发布部署服务到windows

发布选择独立安装,win-64。不选这独立安装服务器需要有对应的.NET Core运行时

发布程序后在程序目录用cmd执行以下代码

代码语言:javascript
复制
sc.exe create 服务名称 binpath=xxxx.exe

二、Worker Service 日志功能

要想在 worker service 中记录日志,可以添加 Microsoft.Extensions.Logging 程序集,默认的 worker service 是 ConsoleLogger,也就是仅记录到 控制台 上,实际业务中不可能这么玩,如果想记录到其他地方该怎么做呢?比如 Windows Events 中,要这么做的话,可以使用 EventLog,在 nuget 上添加 Microsoft.Extensions.Logging.EventLog 包即可。

下面的代码片段展示了如何在 CreateHostBuilder 方法中进行配置将这个log记录到 event 中。

代码语言:javascript
复制
public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureLogging(logFactory => logFactory.AddEventLog())
        .ConfigureServices(services =>
        {
            services.AddHostedService<Worker>();
        }); 
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-05-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 前言
  • 一、ASP.NET Core Worker Service构建系统服务实现任务调度
    • 1.安装对应包
      • 2.添加window服务扩展
        • 3.发布部署服务到windows
        • 二、Worker Service 日志功能
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档