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;前…

c++ primer plus 第16章string 类和标准模板库,string 类输入

c primer plus 第16章string 类和标准模板库,string 类输入 c primer plus 第16章string 类和标准模板库,string 类输入 文章目录 c primer plus 第16章string 类和标准模板库,string 类输入16.1.2 string 类输入程序清单 16.2 strfile.cpp 16.1.2 string 类输入 对于类&…

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

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

题解|2023暑期杭电多校03

【原文链接】 &#xff08;补发&#xff09;题解|2023暑期杭电多校03 1011.8-bit Zoom 不那么签到的签到题、模拟题 题目大意 给定一个 n n n\times n nn 大小的字符矩阵表示一张图片&#xff0c;每种字符代表一种颜色&#xff1b;并给定 Z Z Z 代表缩放倍率 满足以下条…

无人驾驶的未来: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;武汉城市开…

【Pyhton】Pip换源(Windows)

在Python中使用pip换源的方法可以通过修改pip配置文件来实现。具体步骤如下&#xff1a; 暂时修改&#xff08;只应用于本次下载&#xff09; pip install 库名 -i 国内源链接/simple --trusted-host 国内源链接 常见的国内源链接见下方永久修改中的内容。 示例&#xff1a…

【ffmpeg命令入门】ffmpeg转码过程

文章目录 前言转码图示过程含义总结 前言 在数字媒体处理领域&#xff0c;ffmpeg 是一款非常强大的工具&#xff0c;它支持多种音视频格式&#xff0c;可以进行转码、剪辑、滤镜等操作。ffmpeg 的强大功能和灵活性使其成为了音视频处理的首选工具。然而&#xff0c;由于其功能…

python-Web

FLASK整体框架: from flask import Flask,render_templateapp Flask(__name__)app.route("/show/info")#网址 def index():#网址对应的函数return render_template("index.html")#falsk 支持将字符串写入文件if __name____main__:app.run()#访问网站的时…

Java中的压缩与解压缩操作详解

Java中的压缩与解压缩操作详解 在Java编程中&#xff0c;处理压缩和解压缩文件是一个常见的需求。Java提供了多种方式来实现这些操作&#xff0c;包括使用标准的Java类库和第三方库。 本文将介绍如何使用Java进行压缩和解压缩操作&#xff0c;涵盖基本的压缩文件格式如ZIP以及…

获取JVM虚拟机的内存和CPU核心数

获取内存和核心数量 Runtime runtime Runtime.getRuntime();long freeMemory runtime.freeMemory();long maxMemory runtime.maxMemory();long totalMemory runtime.totalMemory();int availableProcessors runtime.availableProcessors();System.out.println("空闲内…

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

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

Android中Context概述

目录 一 概念二 使用三 注意事项 一 概念 Context&#xff0c;上下文&#xff0c;可以获取应用的资源和信息。Context在加载资源、启动Activity、获取系统服务、创建View等操作都要参与。它提供了关于应用环境全局信息的接口。它是一个抽象类&#xff0c;它的执行被Android系统…

WPF TreeView 全选/反选/子级选中父级也选中

// TreeView 全选/反选/子级选中父级也选中CSDN 下载链接 <TreeView Grid.Column"0" Grid.Row"1" Grid.ColumnSpan"2" Name"menuTree" Width"240" ItemsSource"{Binding MenuList}" BorderThickness"0&q…

开发一个自己的chrom插件

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