Windows 服务 同时启动多个服务

 Windows 服务 同时启动多个服务

 独立观察员 2019.02.26

最近需要开发 Windows Service 程序,之前没有接触过,所以把了解到的一些东西记录下来。

Windows 服务程序可以简单理解为需要长时间在后台运行, 而又不需要界面显示的程序,在计算机管理 --> 服务和应用程序 --> 服务中可以看到:

4bbb7b6ec421c74aac26289f24601a73.png

我们先来新建一个 "Windows 服务" 项目,具体可参考《C# 编写 Windows Service(windows 服务程序)》(https://www.cnblogs.com/bluestorm/p/3510398.html)一文。

逻辑写在继承于 ServiceBase 类的类中,该类型的类通过添加 "Windows 服务" 来生成:

d9d51e4722e5e5a0d02c22dc23b5cfa5.png

双击生成的类文件,打开的是一个设计页面,可点击切换到代码视图:

0dae847f19b3daace2bd0fc7a6692ef8.png

代码视图中可以看到,是继承于 ServiceBase 类的,主要逻辑写在 OnStart 和 OnStop 方法中:

27275dffb50a0120e1deb17c376634e0.png

在 Service1 的设计页面右键 -->"添加安装程序",生成 ProjectInstaller.cs ,也是个设计页面,包含一个 serviceProcessInstaller1 组件和一个 serviceInstaller1 组件:

6f5e15ac593f6ac9f22983c6c754bb1d.png

其中 serviceProcessInstaller1 属性中一般将 Account 的值改为 LocalSystem :

2cb467b55b4f872d033feb9c06235c30.png

而 serviceInstaller1 的属性中,Description 是描述信息,DisplayName 是显示的名称,都在开头提到的系统服务管理页面中显示。ServiceName 指定了程序中使用该服务要用的名称。StartType 一般选为 Automatic,代表了自动启动:

27a64b8af73a44979c5f6114524adbae.png

然后就是安装和启动了,有好几种方法,本文采用 InstallUtil.exe 和 批处理 结合的方式。InstallUtil.exe 命令行工具在 % SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe 路径下,可以直接带路径使用,也可以拷到项目中使用。

下面给出批出理代码:

  1. 安装和启动服务

CD /D "%~dp0"
InstallUtil WindowsServiceTest.exe
net start Service1
net start Service2
pause

其中第一行是 cd 到当前目录。第二行是安装服务,WindowsServiceTest.exe 是服务所在的程序名。第三行是启动其中的 Service1 服务。

2、单独启动服务

net start Service1
net start Service2
pause

3、停止服务

net stop Service1
net stop Service2
pause

4、卸载服务

CD /D "%~dp0"
installutil /u WindowsServiceTest.exe
pause

大家可能发现了,除了 Service1,里面还有个 Service2,这就是接下来要讲的安装两个以上服务的方法。(只使用一个服务的话,要把 Service2 删除)

首先按照之前的方法添加 Service2,然后照样添加安装程序,会出现在之前的地方(新增了一个 serviceInstaller2):

07548c209a6fe92ab24a4befb535889b.png

接下来打开 Projectlnstaller.Designer.cs 文件,这个是 VS 自动生成的,本来是不需要我们修改的,但这里似乎有一个 bug (参考:《[c# windows 服务 一个进程 多个服务的使用](https://blog.csdn.net/dkdhn/article/details/50126819)》):

d6d25e42baa95ec386d3b656f34c0495.png

就是上图中的红框框住的一句(AddRange 方法中的 this.serviceInstaller2)并没有自动添加上,所以我们手动加上。

然后在程序入口函数 Program.Main () 中添加 Service2 的调用:

1b7dfe81920dc60fd89771ccfba1468d.png

这样之后就可以生成程序了,然后以管理员身份运行批处理文件(安装和启动服务.bat):

c76a78d103c91fb4bfdb656b19fd43c6.png

然后在服务管理页面就可以看到了:

d69e575e06c9b763ab4b880ec5edd2f5.png

再运行 卸载服务.bat :

b4caa31341572d032b69349ebd4eddb9.png

程序功能也都生效了:

2a6023f1ac038857918ef89a9b12e093.png

好了,就说这些了,最后提供下示例代码地址:https://gitee.com/dlgcy/WindowsServiceTest

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

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

相关文章

Python3.6学习笔记(四)

错误、调试和测试 程序运行中,可能会遇到BUG、用户输入异常数据以及其它环境的异常,这些都需要程序猿进行处理。Python提供了一套内置的异常处理机制,供程序猿使用,同时PDB提供了调试代码的功能,除此之外,…

如何恢复master数据库

今天,重装Sql2000数据库后,在恢复master数据库时出现了错误,提示为“当试图还原master数据库时,必须以单用户模式使用restoredatabase,restore database操作异常终止”。在网上搜索了一下,发现了一篇介绍比较详细的&am…

一、基本remix环境及HelloWord contract《2022 solidity8.+ 版本教程到实战》

这个系列是 solidity8.版本的教程,既然学习了 solidity 就应该明白智能合约是啥,在此系列文章中将不赘述基础概念,只讲解对应的语法,希望读者理解。 环境 solidity 版本:8.(2022年9月8日 最新版本) IDE:h…

遥感空间尺度转换技术(升尺度和降尺度)

遥感图像的一个基本特征是空间分辨率。目前已经可以有效获取大量不同空间分辨率遥感数据。 尺度和尺度转换已经成为遥感的核心问题之一,人们已经从不同角度提出了这一问题。尺度转换分为两种: 升尺度:从高分辨率到低分辨率的转换;降尺度:从低分辨率到高分辨率的转换。文章…

linux command1

#列出指定用户(当前用户)的组信息 groups #将指定的用户添加(-a)到指定的组内(改组必须已经存在)或指定用户从指定的组中删除(-d) gpasswd –a/-d username groupname #添加组 groupadd grou…

C语言试题六十八之请编写函数实现亲密数

📃个人主页:个人主页 🔥系列专栏:C语言试题200例目录 💬推荐一款刷算法、笔试、面经、拿大公司offer神器 👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 编写函数:…

three.js插件实现立体动感视频播放效果

2019独角兽企业重金招聘Python工程师标准>>> three.js插件实现立体动感视频播放效果 效果描述: 立体式视频播放效果 大家使用的时候可得注意了,它并不支持低版本浏览器 使用方法: 1、将body中的代码部分拷贝到你需要的地方,将视频…

Python3.6学习笔记(五)

网络编程 网络程序出现的比互联网要早很多,实现方式主要依靠网络上不同主机间进程的通信,通信协议最重要的是TCP/IP协议。在这两个协议基础上还有很多更高级的协议,包括HTTP、SMTP等。要进行两个主机间的网络通信,必须四个元素&a…

ArcGIS实验教程——实验三十三:ArcScan自动矢量化完整案例教程

ArcGIS实验视频教程合集:《ArcGIS实验教程从入门到精通》(附配套实验数据)》 文章目录 1 ArcScan 简介2. ArcScan使用前提及注意事项3. ArcGIS自动矢量化案例1 ArcScan 简介 ArcScan是ArcGIS Desktop的打展模块,是栅格数据矢量化的套工具集, 用这些工具,可以创建要素,将…

抢先体验全新标签页!Windows 11 必备小工具下载

面向 Dev 频道的 Windows 预览体验成员,微软近日推送了 Windows 11 新预览版,为文件资源管理器带来了全新标签页功能。Windows 11 文件资源管理器全新标签页介绍在 Windows 11 预览版中,新功能分别向 A 和 B 两组用户的电脑推送测试。A 用户的…

thymeleaf模板的使用(转)

作者:纯洁的微笑 出处:http://www.ityouknow.com/ 在上篇文章springboot(二):web综合开发中简单介绍了一下thymeleaf,这篇文章将更加全面详细的介绍thymeleaf的使用。thymeleaf 是新一代的模板引擎,在spring4.0中推荐使…

二、基本类型及函数使用《2022 solidity8.+ 版本教程到实战》

一、基本变量类型 solidity 中的基本变量类型与一般编程中类似: // SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.0; contract Hello{string public say"Hello 1_bit";int public ival-1;uint public uval1;address public aval0xd9145CCE52…

Ruby 学习笔记3

在Ruby中有很多方法是以?和!号结尾的 “?”被用于标示谓词,即返回Boolean直的方法,如Array.empty?(判断数组中元素是否为空) “!”出现在方法名尾部的感叹号表明使用该方法是需要多加小心。许多Ruby的核心类都定义了 成对的方…

C语言试题六十九之请编写函数判断一个数是不是素数

📃个人主页:个人主页 🔥系列专栏:C语言试题200例目录 💬推荐一款刷算法、笔试、面经、拿大公司offer神器 👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 编写函数:…

Python3.6学习笔记(六)

WSGI Python Web Server Gateway Interface 规范学习 由于Python的灵活性,提供了多种方式可以作为服务端语言,包括Python编写的服务器(Medusa)、Python处理模块(mod_python),或者使用CGI、FastCGI方式触发…

Markdown编辑器模板

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…

as3文本框的动态拖拽和编辑

如今非常多软件都支持了编辑界面的文本拖拽和点击编辑来直接改动数值, 这样便于操作, 并且体验性也好, 抛砖引玉吧 于是就用好久没编写的as3来写了一下: 由于用的flash ide写的没有提示, 就临时不做细节处理了, 假设用于project上会有点小问题, 只是不影响本效果展示 代码: imp…

为 HttpClient 注册自定义请求标头

前言上次,我们介绍了《在 ASP.NET Core 中使用 HTTP 标头传播》。但是有时候,当服务间需要互相调用时,也需要将创建一些自定义标头传播到目标服务。比如, ServiceA 已经进行了身份验证,那么当它调用 ServiceB 时&#…

图片压缩上传Thumbnailator 插件

假如你现在还在为自己的技术担忧,假如你现在想提升自己的工资,假如你想在职场上获得更多的话语权,假如你想顺利的度过35岁这个魔咒,假如你想体验BAT的工作环境,那么现在请我们一起开启提升技术之旅吧,详情请…

jQuery实现登录提示

实现效果&#xff1a;将鼠标聚焦到邮箱地址文本框时&#xff0c;文本框 内的“请输入邮箱地址”文字将被清除&#xff1b; 若没有输入任何内容&#xff0c;鼠标移除后邮箱地址文本框被还原。 1 <!DOCTYPE html>2 <html>3 <head>4 <meta charset"…