.NET辅助角色服务入门简介

embedded/2024/10/18 23:23:24/

在日常开发中,并不是所有的功能都是用户可见的,还在一些背后默默支持的程序,这些程序通常以服务的形式出现,统称为辅助角色服务。今天以一个简单的小例子,简述基于.NET开发辅助角色服务的相关内容,仅供学习分享使用,如有不足之处,还请指正。

概述

根据项目需求不同,创建长时间运行的服务的原因有很多,例如:

  • 处理 CPU 密集型数据,比如文件检索或图片识别等。
  • 在后台对工作项进行排队,比如:批量发送短信或邮件等操作。
  • 按计划执行基于时间的操作,比如:间隔2秒执行一次某操作。

后台服务处理通常不涉及用户界面 (UI),但可以围绕它们来构建 UI。 在早期使用 .NET Framework 时,Windows 开发人员可能出于这些目的创建 Windows 服务。 现在通过 .NET,你可以使用 BackgroundService(它是 IHostedService 的实现)或实现自己的服务。

涉及知识点

辅助角色服务中,许多术语被误用为同义词。 本文分定义了其中一些术语,以使其在本文中的意图更为直观。

  • 后台服务:BackgroundService 类型。
  • 托管服务:IHostedService 的实现或 IHostedService 本身。
  • 长时间运行的服务:持续运行的任何服务。
  • Windows 服务:Windows 服务基础结构,最初以 .NET Framework 为中心,但现在可通过 .NET 访问。
  • 辅助角色服务辅助角色服务模板。

创建项目

1. 选择模板

在Visual Studio开发工具中,新建项目,在项目模板中选择“辅助角色服务”模板,然后点击下一步,打开项目配置页面,如下所示:

2. 配置新项目

在项目配置页面,输入项目名称,位置,然后点击下一步,所下所示:

3. 选择框架

选择辅助角色服务需要的框架,本示例选择VisualStudio2022默认的.NET 6.0(长期支持)。不使用顶级语句,可根据具体情况进行勾选,建议勾上。如下图所示:

项目结构

项目创建成功后,如下所示:

  • 默认框架创建的辅助角色服务,自动添加了Microsoft.Extensions.Hosting包。
  • Program 类,包含了程序入库 main函数。在函数内注入了Worker服务。
  • Worker表示一个后台运行服务,继承自BackgroundService,重写ExecuteAsync方法,主要用于业务逻辑处理。

具体如下所示:

默认情况下,辅助角色模板不启用服务器垃圾回收 (GC),因为有很多因素决定了这样做的必要性。 所有需要长时间运行服务的场景都应考虑此默认设置对性能的影响。 若要启用服务器 GC,将 ServerGarbageCollection 节点添加到项目文件:

<PropertyGroup><ServerGarbageCollection>true</ServerGarbageCollection>
</PropertyGroup>

 

注入组件

在本示例中,首先通过Nuget包管理器进行安装,需要安装的组件有两个:

1. 采用后台日志记录信息,需要安装NLog对Microsoft.Extensions.Logging的扩展。

2. 因为本示例是需要部署成Windows服务,所以需要安装Microsoft.Extensions.Hosting.WindowsServices。

Nuget包管理器页面如下所示:

在Program中应用Windows服务,并注入NLog组件,如下所示:

using NLog.Extensions.Logging;namespace DemoWorkerService
{public class Program{public static void Main(string[] args){IHost host = Host.CreateDefaultBuilder(args).UseWindowsService().ConfigureServices(services =>{services.AddHostedService<Worker>();services.AddLogging(logging =>{logging.AddNLog();});}).Build();host.Run();}}
}

 

辅助角色类

通过模板创建的项目中,默认提供了一下Worker类,此类是BackgroundService的派生类,主要提供StartAsync,ExecuteAsync,StopAsync三个方法可供重写。如下所示:

namespace DemoWorkerService
{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 start at: {time}", DateTimeOffset.Now);return base.StartAsync(cancellationToken);}protected override async Task ExecuteAsync(CancellationToken stoppingToken){while (!stoppingToken.IsCancellationRequested){_logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);await Task.Delay(1000, stoppingToken);}}public override Task StopAsync(CancellationToken cancellationToken){_logger.LogInformation("Worker stop at: {time}", DateTimeOffset.Now);return base.StopAsync(cancellationToken);}}
}

 

创建服务并运行

程序开发完成后,可根据实际项目需要打包到指定目录下,然后通过服务管理器命令创建服务,如下所示:

以Windows平台为例:

使用sc.exe工具来管理服务,输入一下命令创建为windows服务
sc.exe create DemoWorkerService binPath=D:\Test\DemoWorkerService\DemoWorkerService.exe
DemoWorkerService 服务名称
D:\Test\DemoWorkerService\DemoWorkerService.exe 生成的运行文件
查看服务状态使用一下命令
sc.exe query DemoWorkerService
启动命令
sc.exe start DemoWorkerService

 可以通过命令行进行启动服务,如下所示:

或者在服务管理窗口,选择服务右键点击启动,如下所示:

注意:以上命令行窗口以管理员身份运行,否则可能会出现权限不足的问题。 

打开程序的运行目录,可以看到日志已正常运行,如下所示:

 以上【.NET辅助角色服务入门简介】的全部内容。


http://www.ppmy.cn/embedded/97796.html

相关文章

【设计模式】工厂模式和抽象工厂模式

工厂模式 function User(role, pages) {this.role role;this.pages pages; }// new User(admin, [home, user, setting]); // new User(user, [home, user]); // new User(guest, [home]);function UserFactory(role) {switch (role) {case admin:return new User(role, [ho…

Vue3+Vite安装配置tailwindCss

考虑到官网不是很好访问&#xff0c;这里记录一下简单步骤方便小友查阅 1. 安装依赖 npm install -D tailwindcss postcss autoprefixer2. 初始化配置文件 npx tailwindcss init -p3.配置模板路径 /** type {import(tailwindcss).Config} */ export default {content: [&quo…

华为的流程管理

华为建设流程体系始于2000年&#xff0c;那时华为公司面临着快速扩张和全球化发展的挑战&#xff0c;意识到传统的管理模式已经无法满足业务发展的需求。为了提高公司的管理效率和竞争优势&#xff0c;华为决定启动流程体系的建设。在建设过程中&#xff0c;华为借鉴了业界最佳…

《博客崩溃源记》

原文链接&#xff1a;https://www.hezebin.com/publish/66a393d03ad6ee047813fe57 背景 百年未有之大变局年夏初&#xff0c;最近在负责前端同学招聘的一面工作&#xff0c;对于一些常见的八股文基础问题做了一下记录… 忽有一日&#xff0c;面试在即&#xff0c;打开博客见…

算法刷题day35|动态规划:121. 买卖股票的最佳时机、122. 买卖股票的最佳时机 II、123. 买卖股票的最佳时机 III

121. 买卖股票的最佳时机 一维dp class Solution { public:int maxProfit(vector<int>& prices) {if (prices.size() 0) return 0;vector<int> dp(prices.size(), 0);dp[0] 0;int mint INT_MAX;for (int i 1; i < prices.size(); i){//更新最小股票值…

基于vue篮球联盟管理系统pf

TOC springboot476基于vue篮球联盟管理系统pf 第1章 绪论 1.1 课题背景 二十一世纪互联网的出现&#xff0c;改变了几千年以来人们的生活&#xff0c;不仅仅是生活物资的丰富&#xff0c;还有精神层次的丰富。在互联网诞生之前&#xff0c;地域位置往往是人们思想上不可跨域…

C#单例模式

&#xfeff;using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace _3._3._6_单例模式 {public class Singleton{private static Singleton s_instance;private int _state;private Singleton(int …

c_cpp_properties.json、launch.json、 tasks.json

在 Visual Studio Code 中&#xff0c;c_cpp_properties.json、launch.json 和 tasks.json 是三个重要的配置文件&#xff0c;它们的作用如下&#xff1a; c_cpp_properties.json&#xff1a; 这个文件用于配置 C/C 扩展的 IntelliSense、编译器路径和包括路径等。它帮助 VS Co…