Visual Studio2022中使用.Net 8 在 Windows 下使用 Worker Service 创建守护进程

Visual Studio2022中使用.Net 8 在 Windows 下创建 Worker Service

  • 1 什么是 .NET Core Worker Service
  • 1.1 确认Visual Studio中安装了 ASP.NET和Web开发
  • 2 创建 WorkerService项目
    • 2.1 新建一个WorkerService项目
    • 2.2 项目结构说明
  • 3 将应用转换成 Windows 服务
    • 3.1 安装Microsoft.Extensions.Hosting.WindowsServices
  • 4. 发布
    • 4.1 配置发布成单文件
    • 4.2 发布
  • 5 源代码分析
    • 5.1 BackgroundService 类
      • 5.1.1 抽象函数 ExecuteAsync:
      • 5.1.2 虚函数 StartAsync:
      • 5.1.3 虚函数 StopAsync:
    • 5.2 Worker.cs
    • 5.3 创建进程守护服务类 GuardProcessService
      • 5.3.1 GuardProcessService.cs 源代码
      • 5.3.2 在 Program.cs 中注入服务
      • 5.3.2 在代码中配置守护进程名称
    • 5.4 将日志写入EventLog
      • 5.4.1 了解 EventLog
      • 5.4.2 EventLogLogger
      • 5.4.3 EventLogLoggerProvider
  • 附:WTSGetActiveConsoleSessionId session 0

1 什么是 .NET Core Worker Service

Worker Service 是使用模板构建的 .NET 项目,该模板提供了一些有用的功能,可以将常规控制台应用程序变得更加强大。Worker Service 运行于宿主(Host)的概念之上,宿主维护应用程序的生命周期。宿主还提供了一些常见的特性,如依赖注入、日志记录和配置。
Worker Service 通常是长时间运行的服务,执行一些规律发生的工作负载。

1.1 确认Visual Studio中安装了 ASP.NET和Web开发

在这里插入图片描述

2 创建 WorkerService项目

2.1 新建一个WorkerService项目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.2 项目结构说明

创建出来 Worker Service 项目包含以下文件:

文件含义
Program.cs控制台应用程序的入口点,启动时的“引导程序”。创建并运行宿主以管理应用程序生命周期并生成一个长期运行的服务。
appsettings.json一个提供应用程序配置值的 JSON 文件。
Worker.cs派生自 BackgroundService 基类,用于定义作为后台任务执行的长时间运行的工作负载。在这个文件中,你可以编写你的服务逻辑。

同时在依赖项的包中引入了Microsoft.Extensions.Hosting包。

3 将应用转换成 Windows 服务

为了将当前项目转换成服务的方式在windows上安装运行,也就是将 .NET Core 部署为 windows 服务,项目中需要引用 Microsoft.Extensions.Hosting.WindowsService

3.1 安装Microsoft.Extensions.Hosting.WindowsServices

  • 方法1:在nuget包管理器的程序包管理器控制台中使用命令安装
    在这里插入图片描述
    安装nuget包
Install-Package Microsoft.Extensions.Hosting.WindowsServices

安装记录如下:
在这里插入图片描述

  • 方法2:通过浏览查找添加
    在这里插入图片描述

4. 发布

使用Visual Studio发布:

4.1 配置发布成单文件

在这里插入图片描述
配置发布目标
在这里插入图片描述
配置发布路径
在这里插入图片描述
在这里插入图片描述
完成后,点显示所有设置配置文件设置中选择部署方式:独立
在这里插入图片描述
设置文件发布选项:单文件
在这里插入图片描述

4.2 发布

  • 点击发布按钮发布
    在这里插入图片描述
  • 使用命令行发布:
dotnet publish -r win-x64 -c Release
// 打包成单文件
dotnet publish -r win-x86 -c release /p:publishsinglefile=true /p:publishtrimmed=true

使用SC命令在windows上安装服务

sc create GuardService BinPath=d:\GuardService.exe

使用SC命令设置服务自动启动

scconfig GuardService start=auto

使用SC命令在windows上删除服务

sc delete GuardService

SC其他操作服务的常用命令:启动、停止

sc start GuardService
sc stop GuardService

5 源代码分析

Program.cs源代码

using GuardService;var builder = Host.CreateApplicationBuilder(args);
builder.Services.AddHostedService<Worker>();var host = builder.Build();host.Run();

5.1 BackgroundService 类

BackgroundService 类实现了一个名为 IHostedService 的接口,为我们实现了 IHostedService。提供了三个可重写的方法,可以让我们绑定到应用程序的生命周期中。

5.1.1 抽象函数 ExecuteAsync:

作为应用程序主要入口点的方法。如果此方法退出,则应用程序将关闭。我们必须在 Worker 中实现它。默认情况下 Worker 只重写必要的抽象方法 ExecuteAsync。

protected abstract Task ExecuteAsync(CancellationToken stoppingToken);

5.1.2 虚函数 StartAsync:

在应用程序启动时调用。如果需要,可以重写此方法,它可用于在服务启动时一次性地设置资源;当然,也可以忽略它。

    public virtual Task StartAsync(CancellationToken cancellationToken){_stoppingCts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);_executeTask = ExecuteAsync(_stoppingCts.Token);if (_executeTask.IsCompleted){return _executeTask;}return Task.CompletedTask;}

5.1.3 虚函数 StopAsync:

在应用程序关闭时调用。如果需要,可以重写此方法,在关闭时释放资源和销毁对象;当然,也可以忽略它。

    public virtual async Task 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/872797.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端书籍翻页效果

目录 前端书籍翻页效果前言代码示例创建模板页面css样式编写js代码 结论 前端书籍翻页效果 前端实现翻书效果&#xff0c;附带vue源码 源码下载地址 前言 实际业务开发中&#xff0c;有时候会遇到需要在前端页面内实现翻书效果的需求&#xff0c;本篇文章就为大家介绍如何使…

09 深度推荐模型演化中的“平衡与不平衡“规律

你好&#xff0c;我是大壮。08 讲我们介绍了深度推荐算法中的范式方法&#xff0c;并简单讲解了组合范式推荐方法&#xff0c;其中还提到了多层感知器&#xff08;MLP&#xff09;。因此&#xff0c;这一讲我们就以 MLP 组件为基础&#xff0c;讲解深度学习范式的其他组合推荐方…

电子设备中丝杆模组高精度重复定位技术的原理!

丝杆模组是由螺旋丝杆和导杆组成的一种机械运动控制系统&#xff0c;通过在导杆内进行旋转&#xff0c;使导杆沿着线性方向进行移动&#xff0c;从而实现机械运动的线性控制。丝杆模组以其高精度、高稳定性和可重复定位的特性&#xff0c;在现代工业自动化和精密制造领域发挥着…

controller-from表单1

mvc模式是spring boot 开发web应用程序主要使用模式&#xff0c;mvc分别代表model模型&#xff0c;view是视图 &#xff0c;controller是控制器 controller是对接用户请求数据调用服务层代码&#xff0c;具体怎么操作 浏览器发送http请求给到dispatcherServlet&#xff08;前…

【操作系统】文件管理——文件存储空间管理(个人笔记)

学习日期&#xff1a;2024.7.17 内容摘要&#xff1a;文件存储空间管理、文件的基本操作 在上一章中&#xff0c;我们学习了文件物理结构的管理&#xff0c;重点学习了操作系统是如何实现逻辑结构到物理结构的映射&#xff0c;这显然是针对已经存储了文件的磁盘块的&#xff0…

无人驾驶的未来:AI如何重塑我们的出行世界

无人驾驶汽车&#xff0c;作为人工智能&#xff08;AI&#xff09;技术的集大成者&#xff0c;正以前所未有的速度改变着我们的出行方式。从机器学习到计算机视觉&#xff0c;再到人工智能生成内容&#xff08;AIGC&#xff09;&#xff0c;AI技术的每一次进步都在为无人驾驶汽…

Linux内核编程(八) 添加自定义目录驱动菜单 (Kconfig文件使用)

本文目录 一、Linux 内核驱动目录二、自定义驱动的Kconfig编写●示例&#xff1a;在 drivers 菜单添加一个自己驱动的子菜单。 三、自写驱动的Makefile编写四、总结 一个Linux内核源码&#xff0c;其中包含了很多驱动程序&#xff0c;对应不同的功能。我们在编译内核时。如果将…

设计模式:真正的建造者模式

又臭又长的set方法 经常进行Java项目开发使用各类starter的你一定见过这种代码&#xff1a; public class SwaggerConfig {Beanpublic Docket api() {return new Docket(DocumentationType.SWAGGER_2).select().apis(RequestHandlerSelectors.any()).paths(PathSelectors.any…

【BUG】已解决:ModuleNotFoundError: No module named ‘cv2’

已解决&#xff1a;ModuleNotFoundError: No module named ‘cv2’ 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c;武汉城市开…

基于 Web 的家校联系系统的设计与实现

目录 基于 Web 的家校联系系统的设计与实现 一、绪论 &#xff08;一&#xff09;研究背景 &#xff08;二&#xff09; 研究目的 &#xff08;三&#xff09; 研究意义 二、需求分析 &#xff08;一&#xff09; 功能需求 &#xff08;二&#xff09; 性能需求 &#…

开发一个自己的chrom插件

开发一个自己的chrom插件 一、创建一个文件夹 二、配置文件manifest.json 创建名字为&#xff1a;manifest.json的配置文件&#xff0c;模板如下&#xff1a; {"manifest_version": 3,"name": "Hello World Extension","version": …

AV1 编码标准屏幕内容编码技术概述

AV1 屏幕内容编码 为了提高屏幕捕获内容的压缩性能&#xff0c;AV1采用了几种编码工具&#xff0c;例如用于处理屏幕画面中重复模式的内帧内块复制&#xff08;IntraBC&#xff09;&#xff0c;以及用于处理颜色数量有限的屏幕块的调色板模式。 帧内块拷贝 AV1 编码中的 Intra …

【Elasticsearch7.11】reindex问题

参考博文链接 问题&#xff1a;reindex 时出现如下问题 原因&#xff1a;数据量大&#xff0c;kibana的问题 解决方法&#xff1a; 将DSL命令转化成CURL命令在服务上执行 CURL命令 自动转化 curl -XPOST "http://IP:PORT/_reindex" -H Content-Type: application…

Python: 一些python和Java不同的基础语法

文章目录 1. 数据类型2. 字符串的引用3. 字符串拼接4. Python中的报错5. Python中的输入语句(input)6. 运算符(**和//)7. 除法运算8. 注释方法: #或者三引号9. Python中的比较10. Java中用and, or, not代替逻辑运算符11. 多元赋值12. Python不支持自增自减操作13. 在Python中, …

zookeeper基础知识学习

官网&#xff1a;Apache ZooKeeper 下载地址&#xff1a;Index of /dist/zookeeper/zookeeper-3.5.7Index of /dist/zookeeperIndex of /dist/zookeeper/zookeeper-3.5.7 ZK配置参数说明&#xff1a; 1、tickTime2000&#xff1a;通讯心跳时间&#xff0c;zookeeper服务器与客…

笑中带泪《抓娃娃》

【标题】笑中带泪&#xff0c;《抓娃娃》&#xff1a;一场关于成长的中式惊悚喜剧盛宴在这个夏日炎炎的季节里&#xff0c;一部名为《抓娃娃》的电影悄然上映&#xff0c;以沈腾与马丽的黄金搭档再次点燃观众的热情。然而&#xff0c;当笑声在影院回荡时&#xff0c;一股不易察…

搭建图片缓存服务器,解决图片访问403 Forbidden问题

在现代Web开发中&#xff0c;图片是网站和应用的重要组成部分。然而&#xff0c;有时我们在访问某些图片时会遇到403 Forbidden错误&#xff0c;尤其是自己的应用访问互联网上的三方的图片时&#xff0c;这通常是由于别人的服务器设置了访问限制。本文将介绍如何通过搭建一个图…

7月15日学习打卡,二叉搜索树和字符串操作

hello大家好呀&#xff0c;本博客目的在于记录暑假学习打卡&#xff0c;后续会整理成一个专栏&#xff0c;主要打算在暑假学习完数据结构&#xff0c;因此会发一些相关的数据结构实现的博客和一些刷的题&#xff0c;个人学习使用&#xff0c;也希望大家多多支持&#xff0c;有不…

C#学习

C#学习 1.B站丑萌气质狗C#的循环-判断泛型错误处理面向对象static的使用定义showInfo类和Hero类 在这里插入图片描述 然后在该解决方案add新建一个类库&#xff0c;点击rebuild&#xff0c;会在bin文件夹下生成.dll文件 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direc…

数据类型与运算符

一、进制 1.1 进制的区分 1.2进制的换算 只要掌握计算器的方式即可。人工计算的方式了解一下就行了。 二、计算机数据的存储原理 2.1 存储单位 最小的单位&#xff1a;比特位 bit 1位比特要么为0&#xff0c;要么为1 最基本的单位&#xff1a;字节 …