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

news2024/12/26 11:32:55

在日常开发中,并不是所有的功能都是用户可见的,还在一些背后默默支持的程序,这些程序通常以服务的形式出现,统称为辅助角色服务。今天以一个简单的小例子,简述基于.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.coloradmin.cn/o/2043796.html

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

相关文章

旅行商问题变体:欧几里德平面中线段最小连接算法

问题描述 假设在欧几里德平面上有有限多条线段&#xff0c;如何将它们连接起来&#xff0c;形成一条最小长度的线段链&#xff1f; 首先&#xff0c;自然可以穷举所有情况&#xff0c;找到最优解。还可以采用动态规划、贪心算法找到局部最优解。 另外&#xff0c;则将其作为T…

定时器延时us(hal库)

目录 定时器延时us 配置cubemx ​编辑​编辑新建模块 代码实现 测试代码 定时器延时us 复制工程模板 配置cubemx 新建模块 新建文件HardWare 添加文件HardWare 添加文件路径 添加HardWare 或者直接输入/HardWare 添加.c和.h文件 .h文件 添加防重复定义代码 #ifnd…

麒麟v10(ky10.x86_64)升级——openssl-3.2.2、openssh-9.8p1

系统版本: ky10.x86_64 下载安装包并上传 openssh下载地址 https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable openssl下载地址 https://openssl-library.org/source/index.html zlib下载地址 https://zlib.net/fossils/ 上传安装包 备份配置文件 cp -r /etc/ssh /et…

DePT: Decoupled Prompt Tuning

当前的问题:Base-New Tradeoff(BNT)困境 现有的提示调优方法通常无法摆脱Base-New Tradeoff(BNT)困境&#xff0c;即调优/调整的模型对基本任务的泛化效果越好&#xff0c;对新任务的泛化效果就越差(包含不可见的类)&#xff0c;反之新任务的泛化效果越好&#xff0c;所需要的…

北京城市图书馆-非遗文献馆:OLED透明拼接屏的璀璨应用

在数字化与传统文化深度融合的今天&#xff0c;北京城市图书馆的非遗文献馆以一场前所未有的视觉盛宴&#xff0c;向世人展示了OLED透明拼接屏的非凡魅力与无限可能。这座集阅读、展示、体验于一体的非遗文献馆&#xff0c;通过2*7布局的OLED透明拼接屏&#xff0c;不仅为传统非…

2024.8.15(python管理mysql、Mycat实现读写分离)

一、python管理mysql 1、搭建主mysql [rootmysql57 ~]# tar -xf mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz [rootmysql57 ~]# cp -r mysql-5.7.44-linux-glibc2.12-x86_64 /usr/local/mysql [rootmysql57 ~]# rm -rf /etc/my.cnf [rootmysql57 ~]# mkdir /usr/local/mysql…

高数3.4 函数单调性和曲线的凹凸性

目录 1. 定义 2. 判断方法 3. 证明 4. 例子 1. 定义 2. 判断方法 3. 证明 4. 例子

高频焊机系统介绍及工作原理

一、高频焊机生产的工艺流程 将带钢卷成圆筒形&#xff0c;然后将接缝焊接起来这就形成了焊管。近些年来&#xff0c;随着焊接技术的进步以及社会工业化进程的加快&#xff0c;钢管的焊管技术也得到了较快的发展。其中直缝高频焊机应用广泛&#xff0c;其原理是利用高频电流的邻…

基于Java+SpringBoot+Vue的网上点餐系统

基于JavaSpringBootVue的网上点餐系统 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 哈喽…

大模型学习方法之——大模型技术学习路线

“ 技术学习无非涵盖三个方面&#xff0c;理论&#xff0c;实践和应用**”** 大模型技术爆火至今已经有两年的时间了&#xff0c;而且大模型技术的发展潜力也不言而喻。因此&#xff0c;很多人打算学习大模型&#xff0c;但又不知道该怎么入手&#xff0c;因此今天就来了解一下…

【探索Linux】P.48(高级IO —— I/O多路转接之 poll )

阅读导航 引言一、poll简介二、poll函数接口⭕参数说明 三、pollfd结构体⭕events和revents的取值 四、返回值五、工作原理六、优缺点✅优点✅缺点 七、 使用示例&#x1f6a8;注意事项 总结温馨提示 引言 在上一篇探讨了I/O多路转接之select方法的基础上&#xff0c;本文将深…

第131天:内网安全-横向移动Kerberos 攻击SPN扫描WinRMWinRSRDP

案例一&#xff1a;域横向移动-RDP-明文&NTLM RDP利用的三种方式 1.直接在当前被控主机上进行远程连接 2.建立节点进行连接 3.端口转发&#xff0c;&#xff08;访问当前主机的2222端口等于访问目标的3389&#xff09; 第一种方式(动静太大) 直接利用被控主机进行远程连接…

uniapp left right 的左右模态框

标题 这是组件 <template><div class"content-wrapper"><divv-for"(vla, i) in products":key"i":class"[content-page, getPageClass(i)]"><slot :data"vla"><!-- 用户自定义的内容 --><…

VUE2学习日记 路由

安装路由 路由安装命令&#xff1a; npm install --save vue-router3 创建router文件夹 在src下创建router文件夹 创建index.js 文件 在router文件夹下创建index.js 文件夹 .vue文件的创建 在components文件夹下创建.vue文件 实现 在router文件夹下的index.js中 导入Vu…

搭建内网开发环境(二)|Nexus安装及使用

引言 上一篇教程中按照了 docker 作为容器化工具&#xff0c;在本篇教程中将使用 docker-compose 安装 nexus。 搭建内网开发环境&#xff08;一&#xff09;&#xff5c;基于docker快速部署开发环境 什么是 Nexus Nexus是一个强大的仓库管理器&#xff0c;主要用于搭建和管…

ceph如何增删改查的管理文件

1.创建 Ceph 存储库文件 sudo tee /etc/yum.repos.d/ceph.repo <<EOF [ceph] nameCeph packages for $basearch baseurlhttps://download.ceph.com/rpm-pacific/el8/\$basearch/ enabled1 gpgcheck1 typerpm-md gpgkeyhttps://download.ceph.com/keys/release.asc[ceph-…

200T 数据库非归档无备份恢复---惜分飞

一套近200T的,6个节点的RAC,由于存储管线链路不稳定,导致服务器经常性掉盘,引起asm 磁盘组频繁dismount/mount,数据库集群节点不停的重启,修复好链路问题之后,数据库启动报ORA-01113,ORA-01110 通过Oracle数据库异常恢复检查脚本(Oracle Database Recovery Check)脚本检测,发…

TiDB-从0到1-DM工具

TiDB从0到1系列 TiDB-从0到1-体系结构TiDB-从0到1-分布式存储TiDB-从0到1-分布式事务TiDB-从0到1-MVCCTiDB-从0到1-部署篇TiDB-从0到1-配置篇TiDB-从0到1-集群扩缩容TiDB-从0到1-数据导出导入TiDB-从0到1-BR工具 一、DM原理 支持全量抽取数据\检测新的数据变化同步到下游实例…

易基因:RNA修饰N4-乙酰胞苷(ac4C)的调控机制、检测方法及其在癌症中的作用最新研究进展|新方向

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 N4-乙酰胞苷&#xff08;ac4C&#xff09;是一种高度保守的化学修饰&#xff0c;广泛存在于真核和原核生物RNA中&#xff0c;如tRNA、rRNA和mRNA。这种修饰与多种人类疾病显著相关&#…

【计算机科学的数学基础】二分法查找

二分法查找 问题引入在有序数列中查找 问题引入 问&#xff1a;有15个犯罪嫌疑人排成一排&#xff0c;其中只有1个是真正的“犯人”。你要通过问他们“犯人在哪里&#xff1f;”来找出真正的犯人。没问一次问题都会得到以下3种答案&#xff1a; 我是犯人犯人在我左边犯人在我右…