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

【愚公系列】2022年5月 ASP.NET Core下Worker Service构建系统服务实现任务调度使用vs2019创建WorkerService程序首先nuget安装Microsoft.Extensions.Hosting.Windows在Program中添加UseWindowsService()publicclassProgram{publicstaticvoidMain(string[]args){CreateHostBuilder(args).Build().Run();}

大家好,又见面了,我是你们的朋友全栈君。


前言

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

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

命令行创建如下

dotnet new worker -o myproject

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

1.安装对应包

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

Microsoft.Extensions.Hosting.WindowsServices

在这里插入图片描述

2.添加window服务扩展

在Program中添加UseWindowsService()

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

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。

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执行以下代码

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

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureLogging(logFactory => logFactory.AddEventLog())
        .ConfigureServices(services =>
        { 
   
            services.AddHostedService<Worker>();
        }); 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/157244.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • vue 关闭vue项目中烦死人的ESlint[通俗易懂]

    vue 关闭vue项目中烦死人的ESlint[通俗易懂]【已解决】vue关闭vue项目中烦死人的ESlint很多时候,因为一些书写问题,ESlint会报错。

  • Beta版是什么意思

    Beta版是什么意思

    2021年10月18日
  • C++ fstream详解[通俗易懂]

    C++ fstream详解[通俗易懂]C语言里面对文件的操作是通过文件指针,以及一些相关的函数,那么C++中是如何对文件进行操作的呢?没错,就是通过fstream这个文件流来实现的。当我们使用#include时,我们就可以使用其中的ifstream,ofstream以及fstream这三个类了(ofstream是从内存到硬盘,ifstream是从硬盘到内存),也就可以用这三个类来定义相应的对象了,这三个类分别代表一个输入文件…

  • Android Studio安装教程(超级详细)「建议收藏」

    Android Studio安装教程(超级详细)「建议收藏」AndroidStudio安装教程(超级详细)欢迎使用Markdown编辑器获取AndroidStudio安装AndroidStudio欢迎使用Markdown编辑器你好!这是你第一次使用Markdown编辑器所展示的欢迎页。如果你想学习如何使用Markdown编辑器,可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。获取AndroidStudio安装前提(系统安装了jdk,并且版本在1.8以上)官网下载AndroidDevTools下载AndroidStudio

  • mysql 5.6 安装(转)「建议收藏」

    mysql 5.6 安装(转)「建议收藏」mysql 5.6 安装(转)

  • stream.map的用法_stream

    stream.map的用法_stream使用Stream流时发现其中的map方法使用不好容易理解,以一个小案例详细探讨Stream中map的使用。案例涉及知识点:1、Stream中of方法传入可变参数2、Stream中map元素类型转化方法3、Function匿名接口,自定义类匿名对象的使用4、Lambda表达式为了便于理解,首先借鉴其他博客中的说法,stream()优点无存储。stream不是一种数据结构,它只是某种数据源的一个视图,数据源可以是一个数组,Java容器或I/Ochannel等。为函数式编程而生。对strea

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号