开发语言:C#
开发环境: Visual Studio 2022
微软官方文档:https://learn.microsoft.com/zh-cn/dotnet/framework/windows-services/
最近在公司要求使用Windows服务作为消息队列的消费者,所以自行研究了一下C#中Windows服务如何创建以及如何使用,以及部署的方式。我是西瓜程序猿,此篇记录一下供大家参考学习。
一、Windows服务概述
1.1-Windows服务是什么?
Windows服务是在Windows操作系统上,以后台形式运行的应用程序。它们可以在系统启动时自动启动,并且独立于用户登录。Windows服务通常用于执行那些长时间运行、无需用户交互或需要在后台持续执行的任务。
1.2-Windows能用来做什么?
- 后台任务和自动化:可以使用Windows服务来执行重复性的计划任务、数据同步、定期备份、报告生成等。
- 网络服务:Windows服务可以作为网络服务器提供网络服务,如Web服务器、FTP服务器、邮件服务器等。
- 定时任务:Windows服务可以创建定时任务并在指定时间间隔或特定事件发生时触发执行操作。
- 数据处理:可以使用Windows服务进行数据处理、数据转换、数据清洗等批量处理任务。
- 消息队列:可以用于消息队列的消费者,后台任务一直和消息队列保持长连接,需要消费时会自动接收到进行业务处理。
1.3-Windows服务有什么优势?
- 后台执行:Windows服务在后台运行,不会干扰用户的工作,也无需用户登录即可持续执行任务。
- 系统级别权限:Windows服务可以在系统级别运行,具有更高的权限,可以访问系统资源和执行敏感操作。
- 自动启动:Windows服务可以在系统启动时自动启动,确保任务始终处于运行状态。
- 可靠性和稳定性:Windows服务被设计为长时间运行的应用程序,具有较高的可靠性和稳定性。
二、创建Windows服务
2.1-创建Windows服务项目
(1)打开【Visual Studio】开发工具,然后选择【 Windows 服务(.NET Framework) 】,点击下一步。
注意:Windows服务只有在.NET Framework版本中才有了,在跨平台中使用Worker Service。
(2)修改项目名称和项目存储目录,项目名称我写的是【MyDemoService】,然后框架我选择的是【.NET Farmework 4.8】,这个可以根据自己的需要填写和选择,然后点击【创建】。
创建好的目录如下:【Program.cs】是主程序的入口,【Service1.cs】是服务的入口,可以创建多个,然后在Prodrams.cs中配置就好了。
(3)【Service1】服务名称可以重命名修改,此处我重命名为【MyDemoService】, Program.cs文件中也相对应的也要进行修改。
(4)然后我们就可以在【MyDemoService】中写业务逻辑代码了,有很多种方式可以定位到要写的具体文件,先列举两种常用的。
方法一:在【program.cs】文件中,找到这个类,按键盘上的F12可以直接进入查看文件。
方法二:直接右击,然后点击【查看代码】。
业务代码写到这里面:
到这一步服务就创建好了,然后就写具体的业务代码就行了。注意:服务必须至少重写 OnStart 和 OnStop 才有用。
2.2-服务可以重写的方法
/// <summary>
/// 服务启动:指示服务开始运行时应采取的操作。 必须在此过程中为服务编写代码才能执行有用的操作。
/// </summary>
/// <param name="args"></param>
protected override void OnStart(string[] args)
{
}
/// <summary>
/// 服务停止:指示在服务停止运行时应发生什么情况。
/// </summary>
protected override void OnStop()
{
}
/// <summary>
/// 暂停:指示在服务暂停时应发生什么情况。
/// </summary>
protected override void OnPause()
{
}
/// <summary>
/// 继续:指示服务在暂停后恢复正常运行时应发生什么情况。
/// </summary>
protected override void OnContinue()
{
}
/// <summary>
/// 停止前:指示在系统关闭之前应发生什么情况(如果此时服务正在运行)。
/// </summary>
protected override void OnShutdown()
{
}
2.3-配置日志(log4net)
为了方便测试,先介绍一下如何使用log4net做日志记录,当日志启动时和停止时我们记录一下。
(1)我们在项目目录下新建一个文件夹【LogConfig】,然后再创建一个文件为【log4net.config】。
(2)【log4net.config】内容如下。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<system.web>
<compilation debug="true" targetFramework="4.5.2" />
<httpRuntime targetFramework="4.5.2" />
</system.web>
<log4net>
<!--错误日志:::记录错误日志-->
<!--按日期分割日志文件 一天一个-->
<!-- appender 定义日志输出方式 将日志以回滚文件的形式写到文件中。-->
<appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender">
<!--保存路径:下面路径项目启动的时候自动在C盘中创建log、logError文件-->
<file value="log/error/error_" />
<!-- 如果想在本项目中添加路径,那就直接去掉C:\\ 只设置log\\LogError 项目启动中默认创建