c# 服务

news2024/12/24 2:17:21

是什么

Microsoft Windows 服务(过去称为 NT 服务)允许用户创建可在其自身的 Windows 会话中长时间运行的可执行应用程序。 这些服务可在计算机启动时自动启动,可以暂停和重启,并且不显示任何用户界面。 这些功能使服务非常适合在服务器上使用,或者需要长时间运行的功能(不会影响在同一台计算机上工作的其他用户)的情况。 还可以在与登录用户或默认计算机帐户不同的特定用户帐户的安全性上下文中运行服务。 有关服务和 Windows 会话的详细信息,请参阅 Windows SDK 文档。

可以通过创建作为服务安装的应用程序来轻松创建服务。 例如,假设你想监视性能计数器数据并对阈值作出响应。 可以编写一个侦听性能计数器数据的 Windows 服务应用程序,部署该应用程序并开始收集和分析数据。

可以将服务创建为 Microsoft Visual Studio 项目,并在其中定义代码,以控制可以将哪些命令发送到服务以及在收到这些命令时应采取的操作。 可以发送到服务的命令包括启动、暂停、恢复和停止服务,还可以执行自定义命令。

在创建和生成应用程序之后,可以通过运行命令行实用程序 InstallUtil.exe 并将该路径传递给服务的可执行文件来安装它。 然后,可以使用服务控制管理器 来启动、停止、暂停、恢复和配置服务。 还可以在“服务器资源管理器”的“服务”节点中或使用 ServiceController 类完成许多相同的任务。

服务应用程序与其他 Visual Studio 应用程序

服务应用程序与许多其他项目类型的运行方式存在以下几个方面的不同:

在项目能够以有意义的方式运行之前,服务应用程序项目创建的已编译可执行文件必须安装在服务器上。 无法通过按 F5 或 F11 来调试或运行服务应用程序;无法立即运行服务或单步执行其代码。 相反,必须安装并启动服务,然后将调试程序附加到服务进程。 有关详细信息,请参阅如何:调试 Windows 服务应用程序。

与某些项目类型不同,你必须为服务应用程序创建安装组件。 安装组件在服务器上安装并注册该服务,并使用 Windows 服务控制管理器 为服务创建条目。 有关详细信息,请参阅如何:将安装程序添加到服务应用程序。

服务应用程序的 Main 方法必须为项目包含的服务发出 Run 命令。 Run 方法将服务加载到相应服务器上的服务控制管理器中。 如果使用 Windows 服务 项目模板,则会自动为你编写此方法。 请注意,加载服务与启动服务不同。 有关详细信息,请参阅下面的“服务生存期”。

Windows 服务应用程序在不同于登录用户的交互式工作站的窗口站中运行。 窗口站是一个安全对象,它包含一个剪贴板、一个全局原子集和一组桌面对象。 由于 Windows 服务站不是交互式工作站,因此从 Windows 服务应用程序中引发的对话框将不会显示,并且可能导致程序停止响应。 同样,错误消息应记录在 Windows 事件日志中,而不是在用户界面中引发。

.NET Framework 支持的 Windows 服务类不支持与交互式工作站(即登录用户)的交互。 .NET Framework 也不包括表示工作站和桌面的类。 如果 Windows 服务必须与其他工作站进行交互,则需要访问非管理的 Windows API。 有关详细信息,请参阅 Windows SDK 文档。

Windows 服务与用户或其他工作站的交互必须经过精心设计,以便包括各种场景(如没有登录用户或用户具有一组意外的桌面对象)。 在某些情况下,编写在用户控制下运行的 Windows 应用程序可能更合适。

Windows 服务应用程序在其自己的安全上下文中运行,并在用户登录安装这些应用程序的 Windows 计算机之前启动。 应仔细规划要在哪个用户帐户中运行服务;在系统帐户下运行的服务具有比用户帐户更多的权限和特权。

服务生存期

一项服务在其生存期内会经历几个内部状态。 首先,服务会安装到它将在其上运行的系统上。 此过程执行服务项目的安装程序,并将该服务加载到该计算机的服务控制管理器 中。 服务控制管理器是 Windows 提供的用于管理服务的中央实用程序。

必须在服务加载完成后启动它。 启动该服务以允许它开始运行。 可以从服务“服务控制管理器”、“服务器资源管理器”,或从通过调用 Start 方法的代码来启动服务。 Start 方法将处理进程传递给应用程序的 OnStart 方法,并处理在那里定义的任何代码。

正在运行的服务可以在此状态下无限期地存在,直到它停止或暂停,或者直到计算机关闭。 服务可以三种基本状态之一存在:Running、Paused 或 Stopped。 该服务还可以报告挂起命令的状态:ContinuePending、PausePending、StartPending 或 StopPending。 这些状态指示命令已发出(例如,暂停正在运行的服务的命令),但尚未执行。 可以查询 Status 以确定服务所处的状态,或者在出现其中任一状态时使用 WaitForStatus 执行操作。

可以从“服务控制管理器” 、“服务器资源管理器” ,或通过调用代码中的方法来暂停、停止或恢复服务。 其中的每个操作都可以调用服务中的相关过程(OnStop、OnPause 或 OnContinue),可以在其中定义在服务更改状态时执行的其他处理进程。

服务类型

可以使用 .NET Framework 在 Visual Studio 中创建两种服务类型。 作为进程中唯一服务的服务将分配类型 Win32OwnProcess。 与其他服务共享进程的服务将分配类型 Win32ShareProcess。 可以通过查询 ServiceType 属性来检索服务类型。

如果查询未在 Visual Studio 中创建的现有服务,则可能偶尔会看到其他服务类型。 有关这些服务类型的更多信息,请参阅 ServiceType。

服务和 ServiceController 组件
ServiceController 组件用于连接到已安装的服务并操纵其状态;可以使用 ServiceController 组件启动和停止服务,暂停并继续其运行,并将自定义命令发送到服务。 但是,在创建服务应用程序时,无需使用 ServiceController 组件。 事实上,在大多数情况下,ServiceController 组件应存在于定义服务的 Windows 服务应用程序的单独应用程序中。

操练

创建服务

环境
  • Win11
  • Vs2022
    在这里插入图片描述
    不建议把服务放在C系统盘,避免因为读写权限问题引起无法安装问题
    在这里插入图片描述
    在这里插入图片描述
测试内容
  • 启动时打印一条日志
  • 运行时每隔10s打印一条日志
  • 停止时打印一条日志
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Runtime.Remoting.Contexts;
using System.ServiceProcess;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace MyWindowsService
{
    public partial class MyService : ServiceBase
    {
        public MyService()
        {
            InitializeComponent();
        }

        //服务开启
        protected override void OnStart(string[] args)
        {
            WriteLogs("Start server");
            Task.Factory.StartNew(Handle);
        }
        //服务关闭
        protected override void OnStop()
        {
            WriteLogs("Stop server");
        }

        //需要定时执行的代码段
        private void Handle()
        {
            while (true)
            {
                try
                {

                    var context = "Run: " + DateTime.Now;
                    WriteLogs(context);
                    Thread.Sleep(10000);
                }
                catch (Exception)
                {
                    throw;
                }
            }
        }


        public void WriteLogs(string context)
        {
            var path = AppDomain.CurrentDomain.BaseDirectory + "service.log";
            var fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write);
            var sw = new StreamWriter(fs);
            sw.BaseStream.Seek(0, SeekOrigin.End);
            sw.WriteLine(context);

            sw.Flush();
            sw.Close();
            fs.Close();
        }
    }
}

安装控件配置

在这里插入图片描述
在这里插入图片描述
一切准备好,F6 执行编译

启动服务

可以使用CMD或者PowerShell等进行安装

来到我们的服务程序目录

cd C:\Windows\Microsoft.NET\Framework64\v4.0.30319
系统版本或.net版本不同路径可能不同

安装刚刚编写的服务

Installutil D:\MyWindowsService\MyWindowsService\bin\Debug\MyWindowsService.exe
在这里插入图片描述
在服务中查看
在这里插入图片描述
可使用在此窗口中启动服务,也可以用命令启动
net start myservice
在这里插入图片描述
在这里插入图片描述

调试服务

下面我们来查看刚刚打印的日志
在这里插入图片描述
启动服务后可以调试程序
附加到进程
在这里插入图片描述
可以进入断点,但无法编辑
在这里插入图片描述

到这里,基本的演示就完成了

觉得喜欢的话,可以点赞收藏

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

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

相关文章

metrics-server监控主机资源

使用metrics-server实现主机资源监控获取metrics-server资源清单文件修改metrics-server资源清单文件部署metrics-server资源清单文件验证及授权获取metrics-server资源清单文件 直接使用命令来获取资源清单文件 wget https://github.com/kubernetes-sigs/metrics-server/rele…

车用DCDC双路输出电源模块规格书

产品名称:非隔离稳压双路输出车用电源模块 产品型号:LM36J40W2EH 典型特征值:24V/8V(3A)&5V(2A) u 产品概述 LM36J40W2EH模块电源是一款非隔离型双路输出的开关稳压器。它采用集成IC设计,使用一进两出的接线方式&#xff…

【Html圣诞树】2022年的圣诞节了,祝大家节日快乐。

目录 1. 效果展示2. 源代码1. 效果展示 是最近在互联网上很火的一个效果。 是带有背景音乐的,而且背景音乐支持选择,也支持自定义。 2. 源代码 美丽的圣诞树.html <!DOCTYPE html> <html lang="en"

从零学习 InfiniBand-network架构(十) —— IB协议中全局ID

从零学习 InfiniBand-network架构&#xff08;十&#xff09; —— IB协议中全局ID &#x1f508;声明&#xff1a; &#x1f603;博主主页&#xff1a;王_嘻嘻的CSDN主页 &#x1f511;未经作者允许&#xff0c;禁止转载 &#x1f6a9;本专题部分内容源于《InfiniBand-network…

设备指示灯开关状态识别检测系统 yolov5

设备指示灯开关状态识别检测系统是基于yolo网络深度学习模型&#xff0c;对现场画面进行实时监测识别。自动识别仪表示数或开关状态。我们使用YOLO(你只看一次)算法进行对象检测。YOLO是一个聪明的卷积神经网络(CNN)&#xff0c;用于实时进行目标检测。该算法将单个神经网络应用…

Python中使用zip函数的七重境界

1. 引言 Python中有一些内置函数&#xff0c;可以使我们的代码非常优雅。zip 函数就是其中之一&#xff0c;但是zip 函数的使用对于初学者来说不是很直观&#xff0c;有时容易出错。因此本文将从7个层次来由浅入深地来探讨强大的zip 函数的概念、用法和技巧。 闲话少说&#x…

用HTML写一个2023跨年动画代码(烟花+自定义文字+背景音乐+雪花+倒计时)

*2022年圣诞节到来啦&#xff0c;很高兴这次我们又能一起度过~ 文章目录一、前言二、跨年烟花三、效果展示五、HTML源码一、前言 时光荏苒&#xff0c;白驹过隙。 2022这一年又在忙碌中度过了&#xff0c;过去的一年&#xff0c;我们同努力&#xff0c;我们共欢笑&#xff0c;…

ContentProvider基础知识

ContentProvider基础知识 1.ContentProvider入门 1.简介 不同程序之间的数据交换&#xff0c;不同app之间的数据共享学会如何操作数据学会如何监听数据变化学会URI,URImatcher&#xff0c;ContentUris的如何使用2.基本使用 A应用&#xff0c;使用ContentProvider的子类进行暴漏…

RabbitMQ 第二天 高级 8 RabbitMQ 应用问题

RabbitMQ 【黑马程序员RabbitMQ全套教程&#xff0c;rabbitmq消息中间件到实战】 文章目录RabbitMQ第二天 高级8 RabbitMQ 应用问题8.1 消息可靠性保障8.1.1 消息补偿8.2 消息幂等性保障8.2.1 乐观锁机制第二天 高级 8 RabbitMQ 应用问题 8.1 消息可靠性保障 在RabbitMQ的使…

pytorch【线性回归】【逻辑回归】【softmax回归】

文章目录零、前置函数线性相乘均方误差损失函数梯度下降函数数据的生成函数一、线性回归1.手动实现线性回归2.调库实现线性回归1.定义我们线性回归的模型2.定义我们的误差函数3.定义优化方法4.模型的训练5.开始训练6.查看模型的参数7.计算我们模型的当前的均方误差二、逻辑回归…

【5G RLC】AM模式的数据传输详解

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

Linux内核死锁检测工具——Lockdep

文章目录前言配置内核简单的AB-BA死锁案例实际项目中的死锁前言 死锁是指两个或多个进程因争夺资源而造成的互相等待的现象&#xff0c;如进程A需要资源X&#xff0c;进程B需要资源Y&#xff0c;而双方都掌握对方所需要的资源&#xff0c;且都不释放&#xff0c;这会导致死锁。…

【圣诞快乐】如何用代码画一颗圣诞树?

文章目录一、前言二、创意角度三、java swing版 效果展示四、java swing版 实现步骤&代码五、springboot项目banner版 效果展示六、springboot项目banner版 实现步骤七、 linux shell界面打印版 效果展示八、 linux shell界面打印版 实现步骤一、前言 一年一度的圣诞节来了…

Allegro如何设置差分对内等长规则

Allegro如何设置差分对内等长规则 Allegro上可以对差分网络设置对内等长规则,方便把P/N网络进行等长处理,以下面这对USB为例 具体操作如下 打开Constraint Manage找到这对USB网络

vue3 antd table表格的样式修改(一)调整table表格每行(row)行高过高问题

vue3 antd项目实战——修改ant design vue table组件的默认样式&#xff08;调整每行行高&#xff09;知识调用场景复现实际操作解决a-table表格padding过宽知识调用 文章中可能会用到的知识链接vue3ant design vuets实战【ant-design-vue组件库引入】css样式穿透&#xff08;…

RV1126笔记十三:实现RTMP多路拉流

若该文为原创文章,转载请注明原文出处。 一、介绍 通过RV1126实现RTMP的多路拉流,并在屏幕上显示出来,这里涉及到ffmpeg几个重要知识点,和RV1126如何在屏幕分屏显示。 二、流程图 流程和单路拉流类似,这里只是涉及拉取后的图像需要解码缩放,在合成分屏显示出来。 具体…

【完整】分类模型中类别不均衡问题解决

目录 1. 数据类别不均衡问题 2. 解决办法 过采样&#xff1a; 欠采样&#xff1a; ensemble 方法&#xff1a; 修改损失函数&#xff1a; 梯度调和机制&#xff1a; Dice Loss&#xff1a; 标签平滑&#xff1a; 3. 类别不均衡问题loss设计 4. 梯度调和机制GHM Gradi…

Graphviz安装向导

目录 1、首先在官网下载graphviz 2、安装。 3、测试 1、首先在官网下载graphviz 下载网址&#xff1a;Download | Graphviz 根据自身电脑位数选择合适的下载地址 2、安装。 打开第一步已经下载好的软件。点击下一步&#xff0c;在安装路径选择时可将安装路径修改为 E:\G…

JavaScript:栈的封装及十进制转二进制栈方法实现案例

栈的定义&#xff1a;是只允许在一端进行插入或删除的线性表。首先栈是一种线性表&#xff0c;但限定这种线性表只能在某一端进行插入和删除操作。 JavaScript中对栈的封装 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8&qu…

微信HOOK 协议接口 实战开发篇 2.好友列表与二叉树

前言&#xff1a;由于篇幅所限&#xff0c;文章无法详细到每个步骤&#xff0c;仅能写出关键的HOOK思路 好友列表 好友和群列表在汇编代码中有固定的常量保存 如图示&#xff0c;找到常量&#xff0c;回车进入 入口地址结构为 其指针内部便是我们需要的数据 群列表 搜索Ch…