使用 Visual Studio 开发 Windows 服务

Windows 服务是一种后台运行的应用程序,可以在没有用户界面的情况下执行任务。以下是从概念到具体实现的详细说明。

1. 什么是 Windows 服务

Windows 服务是运行在 Windows 操作系统上的应用程序,具有以下特点:

  • 后台运行:无需用户交互,可在用户登录前启动或注销后继续运行。
  • 自动化任务:适合执行周期性或长期运行的任务。
  • 管理便捷:可以通过“服务管理器” (services.msc) 管理启动、停止和配置。
  • 适用场景:
    • 日志记录
    • 数据备份
    • 系统监控
    • 自动化任务处理

2. Windows 服务的运行机制

Windows 服务通过 Windows 服务控制管理器 (Service Control Manager, SCM) 进行管理。SCM 提供以下功能:

  • 启动、停止、暂停服务。
  • 管理服务生命周期。
  • 注册服务运行状态。

Windows 服务的核心方法包括:

  • OnStart:服务启动时执行。
  • OnStop:服务停止时执行。
  • OnPause 和 OnContinue(可选):服务暂停与继续运行时的处理。
  • OnShutdown:系统关闭时执行的清理逻辑。

3. 使用 C# 开发 Windows 服务

3.1 创建 Windows 服务项目

新建项目:

  • 打开 Visual Studio,选择 文件 > 新建 > 项目。
  • 选择 Windows 服务 (.NET Framework) 模板。
  • 如果未找到模板,可选择 控制台应用程序 并手动转为服务。

项目结构:

  • 默认生成一个继承自 ServiceBase 的类,常为 Service1.cs。

3.2 实现服务逻辑

Service 类基础结构:

using NLog;  // 引入 NLog 命名空间,用于日志记录
using System;
using System.ServiceProcess;  // 引入 Windows 服务的相关命名空间
using System.Threading;  // 引入线程管理相关命名空间

namespace TestService
{
    // 定义 TestService 类,继承自 ServiceBase,表示一个 Windows 服务
    public partial class TestService : ServiceBase
    {
        // 构造函数,用于初始化服务
        public TestService()
        {
            InitializeComponent();  // 调用自动生成的初始化组件方法
        }

        // 创建一个静态日志记录器实例,用于在服务中记录日志
        private static readonly Logger Log = LogManager.GetCurrentClassLogger();

        // 定义一个线程变量,用于执行后台扫描操作
        private Thread ScanThread;

        // OnStart 方法在服务启动时被调用
        protected override void OnStart(string[] args)
        {
            // 服务启动时记录日志
            Log.Debug("开始执行");

            // 初始化扫描线程,指定线程的执行方法为 DoScan
            ScanThread = new Thread(new ThreadStart(DoScan));

            // 启动线程
            ScanThread.Start();
        }

        // 执行扫描操作的方法
        private void DoScan()
        {
            int n = 0;  // 定义一个计数器,用于记录服务运行的次数

            // 使用一个无限循环来模拟后台任务的持续执行
            while (true)
            {
                try
                {
                    // 每次循环记录服务的运行次数
                    Log.Debug("这是服务的第 [" + n.ToString() + "] 次运行。");

                    // 模拟服务运行时的等待,假设这里是一个长时间运行的操作
                    Thread.Sleep(10000);  // 每次循环后暂停10秒(10000毫秒)

                }
                catch (Exception ex)  // 捕获异常并记录
                {
                    // 如果发生异常,记录错误日志
                    Log.Error("出现了错误:" + ex);
                }

                // 每次循环完成后,再次暂停10秒
                Thread.Sleep(10000);

                // 递增计数器
                n += 1;
            }
        }

        // OnStop 方法在服务停止时被调用
        protected override void OnStop()
        {
            // 如果 ScanThread 存在,表示线程仍在运行
            if (ScanThread != null)
            {
                // 停止线程(不推荐使用Abort,后面有改进方式)
                ScanThread.Abort();

                // 清空线程引用
                ScanThread = null;
            }
        }
    }
}

3.3 安装NLog日志记录程序包

使用 Visual Studio 开发 Windows 服务_第1张图片

3.4 App.Config 配置文件

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog"/>
  </configSections>

  <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <targets>
      <target name="file" xsi:type="File" fileName="${basedir}/Logs/${date:format=yyyy-MM-dd}/${date:format=yyyy-MM-dd}.txt" layout="[${date:format=yyyy-MM-dd HH\:mm\:ss}][${level}] ${message} ${exception}"/>
    </targets>
    <rules>
      <logger name="*" minlevel="Debug" writeTo="file"/>
    </rules>
  </nlog>

    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
    </startup>
</configuration>

4 .服务安装配置

1、Service1.cs 右键,添加安装程序

2、相关配置如下

使用 Visual Studio 开发 Windows 服务_第2张图片
使用 Visual Studio 开发 Windows 服务_第3张图片

5. 安装和启动服务

安装服务

使用命令行工具:
打开 命令提示符(管理员模式),并使用 sc 命令来安装和启动服务。

sc create MyService binPath= "C:\Path\To\Your\Service.exe"
sc start MyService

使用 Visual Studio 开发 Windows 服务_第4张图片
使用 Visual Studio 开发 Windows 服务_第5张图片

停止服务

你可以通过以下命令停止服务:

命令行:

sc stop MyService

卸载服务

要卸载服务,可以使用以下命令:

命令行:

sc delete MyService

使用 Visual Studio 开发 Windows 服务_第6张图片

你可能感兴趣的:(C#,.Net,visual,studio,windows,ide,c#,.net)